承载,承载。这词听起来挺陌生……
在WCF里面官方有三种承载方式:
1:IIS中承载
2:在Windows进程激活服务(WAS)中承载
3:在托管应用程序中承载(也就是传说中的自承载)
一个个来介绍,在IIS中承载跟我们部署普通的ASP.NET和Web Service程序类似,在IIS中建立应用程序,把我们WCF文件拷贝到相应目录就好。在IIS中承载WCF服务,IIS7.0版本只能限于HTTP通信。相应的条件我们先激活WCF HTTP组建,在Win 7 中,打开控制面板,打开或关闭Windows功能.如图
如果我们用生成客户端代码类形式调用WCF服务,需要用到SvcUtil.exe工具。
下面我们看例子。一般来说我们如果新建项目的时候。新建的是WCF服务项目,那么他本身就寄托在IIS上,我们配置好配置文件就可以在浏览器中浏览我们的WCF服务了。这次我们是通过IIS来承载我们服务。首先新建一般的WCF服务项目,他本身生成的代码我们稍作修改。

[ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); } public class Service1 : IService1 { public string GetData(int value) { return string.Format("IIS: 承载{0}", value); } }
配置文件改成

1 <?xml version="1.0" encoding="utf-8"?> 2 <configuration> 3 4 <system.web> 5 <compilation debug="true" targetFramework="4.0" /> 6 </system.web> 7 <system.serviceModel> 8 <services> 9 <service name="WcfIISChengzai.Service1" behaviorConfiguration="WcfIISChengzaiBehavior"> 10 <endpoint address="" binding="wsHttpBinding" contract="WcfIISChengzai.IService1" /> 11 12 </service> 13 </services> 14 <behaviors> 15 <serviceBehaviors> 16 <behavior name="WcfIISChengzaiBehavior"> 17 <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点 --> 18 <serviceMetadata httpGetEnabled="true"/> 19 <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 --> 20 <serviceDebug includeExceptionDetailInFaults="false"/> 21 </behavior> 22 </serviceBehaviors> 23 </behaviors> 24 <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 25 </system.serviceModel> 26 <system.webServer> 27 <modules runAllManagedModulesForAllRequests="true"/> 28 </system.webServer> 29 30 </configuration>
然后我们像在IIS中部署普通asp.net web程序一样部署我们的IIS。添加应用程序,选好目录,把我们WCF服务项目编译好后的文件
拷贝到我们IIS目录下去,注意的是,如果你新建的是类库项目BIN文件夹下一般有Debug文件夹,我们需要把Debug文件夹下的dll文件直接拷贝到我们bin目录下面来。这样我们就可以以IIS的方式浏览我们SVC文件了。
http://localhost:8081/TcpTest/Service1.svc
我们这次用微软提供的SvcUtil工具生成wcf客户端代理类来调用我们的WCF服务,这样的话我们在我们程序中就像调用我们本地类一样调用WCF程序了。我用的是VS2010 命令行工具,在C盘中找到SvcUtil.exe 拷贝到我们的命令行工具默认的问价夹下然后用下面代码生成客户端代理类。要注意的是最后的地址必须是我们IIS在网页中浏览我们WCF的地址。
然后生成的代理类如下,还有生成的配置文件:
这样我们在程序中调用wcf服务只需要把这两个文件拷贝到我们项目中区即可。

1 static void Main(string[] args) 2 { 3 Service1Client sc = new Service1Client(); 4 Console.WriteLine(sc.GetData(5)); 5 sc.Close(); 6 }
-----------------------------------------------------------------------------------------------------------------------------------
上面所讲的只是我们三种承载WCF服务的一种,另外在Windows进程激活服务(WAS)中承载我在服务器做的例子出了点错误,暂时还没发现原因,在这先不列出来,有时间再详细去看看。现在拉说说我们第三种承载WCF服务的方法在托管应用程序中承载(也就是传说中的自承载。控制台程序,Winform程序都可以。)
-----------------------------------------------------------------------------------------------------------------------------------
直接看例子,先新建两个控制台项目:SelfHost为我们服务程序。SelfHostClient为调用我们的服务程序。
服务代码:

1 namespace SelfHost 2 { 3 [ServiceContract(Namespace = "Http://SelfHost")] 4 public interface ISelfHost 5 { 6 [OperationContract] 7 string GetString(int i); 8 } 9 10 public class Program : ISelfHost 11 { 12 public static void Main(string[] args) 13 { 14 using (ServiceHost serviceHost = new ServiceHost(typeof(Program))) 15 { 16 serviceHost.Open(); 17 Console.WriteLine("服务启动了"); 18 Console.WriteLine(); 19 Console.ReadLine(); 20 } 21 } 22 23 public string GetString(int i) 24 { 25 return "自承载:" + i.ToString(); 26 } 27 } 28 }
配置文件:

1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <system.serviceModel> 4 <services> 5 <service name="SelfHost.Program" behaviorConfiguration="HostSelfServiceBehavior"> 6 <host> 7 <baseAddresses> 8 <add baseAddress="http://localhost:8081/SelfHost/Program"/> 9 </baseAddresses> 10 </host> 11 12 <endpoint address="" binding="wsHttpBinding" contract="SelfHost.ISelfHost" /> 13 <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 14 </service> 15 </services> 16 <behaviors> 17 <serviceBehaviors> 18 <behavior name="HostSelfServiceBehavior"> 19 <serviceMetadata httpGetEnabled="True"/> 20 <serviceDebug includeExceptionDetailInFaults="False" /> 21 </behavior> 22 </serviceBehaviors> 23 </behaviors> 24 25 </system.serviceModel> 26 27 </configuration>
需要注意的是我们此服务终结点地址就是http://localhost:8081/SelfHost/Program。在生成我们客户端代理类的时候,就用此地址来生成前提必须是我们服务是启动的。
运行我们的SelfHost项目:
然后也用我们SvcUtil工具来生成客户端代理类。
同样生成文件拷贝到我们客户端项目中去:
然后调用

1 class Program 2 { 3 static void Main(string[] args) 4 { 5 SelfHostClient shc = new SelfHostClient(); 6 Console.WriteLine(shc.GetString(5)); 7 Console.Read(); 8 shc.Close(); 9 } 10 }
运行效果:
自承载可以承载在任何.NET Framework程序中,是灵活性最好的宿主选项,因为此服务需要部署的基础结构最少。但是也同时是最不可靠的宿主选项。我们一般调试WCF服务的时候可以以自承载方式承载我们WCF服务。