本文转自:http://www.cnblogs.com/chenxizhang/archive/2011/06/21/2085979.html

随即无异首文章,是总结一下WCF技术,以及因此技能进步出的几乎独独立以场景,并且我将尝试对这些不同的WCF实现的规律进行有比较分析。

有关WCF这个技能之基本概念,如果您不是不行懂,可以参见一下关于的文档

微软开发者中心

http://msdn.microsoft.com/en-us/netframework/aa663324

 

我的博客中先前吧起众多顿时地方的牵线

http://zzk.cnblogs.com/s?w=blog%3achenxizhang+wcf&p=1

 

言归正传,我将先概括一下WCF技术的背景、核心元素、目前的一流以场景。然后对这些使场景更地展开一些解析以及于,以便帮助大家再好地了解,并且了解当何时应该选用哪一样种情景。(即便你未曾时间错开押那基本上材料,通过本文为以发出一个大纲挈领的认识)

 

历史背景:

WCF,全称是Windows Communication
Founcation,它当作微软新一代的报道技术,首先正式面世在.NET Framework
3.0惨遭,伴随在Windows
Vista的发布而名噪一时。在此之前,曾经当Winfx的一模一样有为人所知,其代号为indigo。

用作Foundation(基础模块),WCF是定点在微软.NET平台上落实统一之音服务通讯机制。它怪好地接到了事先的有余分布式开发技术的长处,并且提供了联的编程和访问的模子,逐渐改为SOA解决方案受到的主流技术,受到了大规模的关切同运用。

json 1

核心因素:

自打技术面理解WCF,可以分成三独元素(俗称WCF的ABC)

1. style=”color: #ff0000;”>Address(where):地址,是依靠访问服务之URI(可以是一个http地址,也可以是tcp的地点)

  1. style=”color: #ff0000;”>Binding(how):绑定,是乘报道所动的磋商,例如http,net.tcp,msmq等等

3. style=”color: #ff0000;”>Contract(what):合约,是负报导的标准,例如服务的合同,数据的合约等等。

 

由系统层面理解WCF,可以分成四个因素

1.Contract:合约,定义一拟合约,通常是WCF开发的起点。这吗是绝无仅有要以宿主和客户端里共享的消息,通常是局部接口(interface)定义。

2.Service:服务,基于合同实现之一个切实可行服务。通常是部分品种(class)定义,实现了业务逻辑。

3.Host:宿主,既然服务是一个class,它自身是无法对客户端请求进行响应的。所以用来一个宿主程序来提供源源的监听。WCF的宿主可以是自由的应用程序,非常灵活。

4.Client:客户端,任何客户端(例如Windows Forms,WPF,
Silverlight,Console
Application,甚至Javascript,或者java,php等等)都可以透过自己的点子来拜访WCF.

 

行使场景:

WCF
从披露到现在之将近5年左右底流年,经过了频繁增高和改进,从极度开始就的SOAP
Service的计,发展下其他多动场景,分别是

  1. SOAP Services

  2. WebHttp Services

  3. Data Services

  4. Workflow Services

  5. RIA Services

 

下我用对准这些使场景一一进行讲解

【注意】我常常以WCF技术与部分讲座中,都见面感慨WCF配置的劲。宿主和客户端都可通过安排文件之法门定义、更改WCF服务的作为。可以这样说,在WCF中,几乎什么还足以配备。这实在很可怜。所以下面的执教,很多都是用配备文件的计来说明问题。

 

1. SOAP Services

这种景象是WCF一开端即支持之,也是极致完好的一个。

为什么叫SOAP
Services呢?这是以WCF服务是基于消息之简报机制,而其的音信是叫装进为一个SOAP
Envelope(SOAP 信封的)

【备注】SOAP的完备是Simple Object Access
Protocol,我们一般翻译啊简易对象看协议。

一个独立的SOAP Request(代表了客户端发到服务器的乞求)

json 2

一个榜首的SOAP Response

json 3

这种服务是因操作(Operation)为骨干的,也就是说,我们得以了控制服务之富有细节,包括定义合约,实现劳务,实现宿主等等。这中间来一定量交汇意思,我们拿生足的灵活性,因为所有一切都是可以决定的;同时,我们吧需要具备足够的专业知识,因为具备一切还要而协调控制。

咱俩来拘禁一个杰出的WCF SOAP Service的部署文件

  <system.serviceModel>
    <services>
      <service name="WcfService2.Service1" behaviorConfiguration="WcfService2.Service1Behavior">
        <!-- Service Endpoints -->
        <endpoint address="" binding="wsHttpBinding" contract="WcfService2.IService1">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfService2.Service1Behavior">
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

 

SOAP Services是从.NET Framework
3.0一如既往发端便提供的,在继承版本被,也出无数改进,包括对WS-*专业更好的支持,以及供了累累默认的布局选,简化了配备的做事。

【备注】值得一提的是,微软研发集团上海办公室马上边有一个集体,直接参与了WCF的初本子的过剩职能及工具的计划及支付,包括对配置的简化设计。感谢她们的行事。

 

咱们来拘禁一个.NET Framework 4.0底下的WCF服务默认的配备文件

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

经过简单地比较就是得掌握,在.NET Framework
4.0受到,我们并不曾见到端点(EndPoint)的定义,这是怎么回事呢?难道现在非需定义端点了为?当然不是,区别在于,.NET
Framework4的ServiceHost将机关地报了名几单默认的EndPoint。

【备注】如果无是为以开发阶段调试要而开启元数据以及调剂支持,上面的配备文件,甚至足以是拖欠的,什么还无欲定义。

 

关于ServiceHost以及默认的端点的信,有趣味可以参照

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehost.aspx

 

总结:采用这种方式开展开之WCF,可以因我们的要求,使用任意的Binding,以支撑不同之客户端,并且提供在不同的场合下最为好之快慢,还可实现诸如缓存,队列,事务协调等高级功能。

 

2. WebHttp Services

这种服务之面世,是因一个比暖的定义:RESTFul。可以如此说,这是WCF
Restful的一个实际实现。从.NET Framework 3.5初步供。

所谓RESTFul的定义,有趣味可以参考 http://zh.wikipedia.org/wiki/REST
以及本人事先写了之有博客文章:http://zzk.cnblogs.com/s?w=blog%3Achenxizhang%20rest

 

大体的意是:

表象化状态转变(英文:Representational State
Transfer
,简称REST)是Roy
Fielding博士在2000年异的博士论文中提取出来的同栽软件架构风格。

当前当三种植主流的Web服务心想事成方案受到,因为REST模式的Web服务及复杂的SOAP和XML-RPC相比之下来讲明显的愈发简明,越来越多之web服务开始运用REST风格设计和促成。例如,Amazon.com供类似REST风格的Web服务开展图书查找;雅虎供的Web服务啊是REST风格的。

REST
从资源的角度来察看整网络,分布在各地的资源由URI确定,而客户端的采用通过URI来获取资源的表形。获得这些表形致使这些应用程序转变了那个状态。随着不断取得资源的表形,客户端应用持续地于转移着其状态,所谓表形化的状态转变(Representational
State Transfer)。

今日不是特地来探讨REST的,我们要看WCF是怎么样贯彻对REST支持,以及哪些使这种作风json的劳动。

实现WCF
Restful,关键在于一个初的Binding方式,也尽管是WebHttpBinding。所以这种劳动,我这边将该名WebHttp
Services。

WebHttp Services是当人情的SOAP
Services基础及的一个加强,它还是是依据操作(Operation)的,只不过这些Operation可以直接通过Uri访问到,而随便需客户去编写一个特的客户端。

而且,WebHttp
Services提供了片栽不同之音格式,第一种植是XML,第二种植是Json。这将越有益于诸如Javascript这种客户端来访问服务。

只要兑现WebHttp,我们率先使补充加一个引用,如下

json 4

 

然后 ,我们好定义一个不同寻常之Operation

        [OperationContract]
        [WebGet]
        string HelloWorld();

【注意】这里经过WebGet这个Attribute,声明该操作是足以直接以Http访问中访问的

下是该操作的实现

using System;
using System.ServiceModel.Activation;

namespace WcfService1
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    [AspNetCompatibilityRequirements(RequirementsMode= AspNetCompatibilityRequirementsMode.Required)]
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            return string.Format("You entered: {0}", value);
        }

        public CompositeType GetDataUsingDataContract(CompositeType composite)
        {
            if (composite == null)
            {
                throw new ArgumentNullException("composite");
            }
            if (composite.BoolValue)
            {
                composite.StringValue += "Suffix";
            }
            return composite;
        }


        public string HelloWorld()
        {
            return "Hello,world";
        }
    }
}

 

【备注】该服务得声明也AspNetCompatibility

 

为了用该服务支持WebHttpBinding,我们需要修改配置文件如下(粗体部分是我们这次添加的)

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WcfService1.Service1">
        <endpoint address="" behaviorConfiguration="WcfService1.Service1AspNetAjaxBehavior"
          binding="webHttpBinding" contract="WcfService1.IService1" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WcfService1.Service1AspNetAjaxBehavior">
          <enableWebScript />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

 

 

万一是这般的概念,那么在浏览器被我们不怕得一直看该服务及其操作

json 5

既是RESTful,那么就是可一直在地方栏像下这样看

json 6

咱发现她的返回值是application/json格式的

json 7

切实返回的是啊内容为?

json 8

 

也就是说,WebHttp
Service默认是回到json格式的多少的,这便死爱在JAVASCRIPT中动用该服务。例如

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="WcfService1._default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script src="jquery-1.4.3.min.js" type="text/javascript"></script>
    <script type="text/javascript" language="javascript">
        $(function () {
            $("#btHelloworld").click(function () {
                var uri = "Service1.svc/HelloWorld";
                $.getJSON(uri, null, function (result) {
                    alert(result.d);
                });
            });

        });
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <input type="button" id="btHelloworld"  value="call webhttp Service"/>
    </div>
    </form>
</body>
</html>

当页面被测试的力量如下

 

json 9

 

值得注意的凡,WebHttp
Service除了支持Json格式之外,也支撑XML格式,我们得以经过修改WebGet这个Attribute的设置来达到目的

        [OperationContract]
        [WebGet(ResponseFormat=WebMessageFormat.Xml)]
        string HelloWorld();

 

 

为可由此部署文件的道来安(注意粗体部分)

<?xml version="1.0"?>
<configuration>

  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WcfService1.Service1">
        <endpoint address="" behaviorConfiguration="WcfService1.Service1AspNetAjaxBehavior"
          binding="webHttpBinding" contract="WcfService1.IService1" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WcfService1.Service1AspNetAjaxBehavior">
          <enableWebScript />
          <webHttp defaultOutgoingResponseFormat="Xml"/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

 

假使就此XML格式的话,那么以浏览器测试的功用如下

json 10

json 11

 

总结:WebHttp Services是以SOAP
Services基础及的一个改进,它不是回来SOAP
Evenlope,而是基于需要返回XML或者JSON数据。这样的统筹,目的是为服务越来越爱使。同时,该服务是WCF
Restful的有血有肉落实。

 

【备注】
由于篇幅过长,另外三栽服务,我以另外单独用平等篇稿子来分析比较,敬请期待

  1. Data Services

  2. Workflow Services

  3. RIA Services

相关文章

网站地图xml地图