一、服务端的配置 在WCF中服务可以寄宿在不同类型的宿主中(WEB程序[IIS]、控制台程序、WinForm程序),需要引用System.ServiceModel
1、控制台程序: Main函数中
class Program{
static void Main(string[] args)
{
using (ServiceHost host=new ServiceHost(typeof(BLL.UserInfoService)))
{
host.Open();
Console.ReadKey();
}
}
}
配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="BLL.UserInfoService" behaviorConfiguration="behaviorConfiguration"> <!--服务名-->
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/"/> <!--IP地址-->
</baseAddresses>
</host>
<endpoint address="" binding="basicHttpBinding" contract="IBLL.IUserInfoService"></endpoint> <!--终结点中配置服务契约-->
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="behaviorConfiguration">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
2、WinForm程序 :可以写在窗体的构造函数中,但是容易造成线程的阻塞,所以尽量也写在WinForm程序的Main的函数中(代码大致同上)
3、IIS (WEB应用程序):需要创建SVC文件 并且修改配置文件
为WCF添加Service.svc文件 <%@ServiceHost Service="BLL.UserInfoService"%>
在IIS中进行配置 http://127.0.0.1:801/Service.svc(WEB程序发布到IIS会有相应的地址,客户端请求该地址下.svc文件即可)
服务端配置文件的配置 添加
<system.ServiceModel>
<services>
<service name="BLL.UserInfoService">
<endpoint binding="wsHttpBinding" contract="IBLL.IUserInfoService"/>
</service>
</services>
</system.ServiceModel>
二、客户端调用服务端的三种方式 (如果是调用web应用程序,配置文件中地址应指向.svc文件)
1、和WebService一样 添加服务引用,获取相应的类(会自动修改配置文件)
ServiceReference1.WebService1SoapClient clint = new ServiceReference1.WebService1SoapClient();
int r=clint.Test(3, 6);
Response.Write(r);
2、通过 svcutil 工具 :
我们将使用微软的svcutil工具生成UserInfoService服务的客户端代理类,通过Visual Studio 2015命令提示(以管理员身份运行),启动命令环境。
确认服务已启动
切换当前路径到解决方案目录:cd C://.........(当前目录)
输入命令:svcutil http://localhost:8000/?wsdl /o:UserInfoServiceClient.cs 在指定目录自动创建服务客户端代理类 。执行成功后,会在解决方案 目录下生成两个文件:o:UserInfoServiceClient.cs 和output.config 把output.config重命名为App.config (如果自己引用了 IBLL.IUserInfoService) 就到配置文件中把相应的创建接口类的代码删除 和最后一个没用的方法 添加引用System.ServiceModel
然后就可以在程序中调用服务端的方法了
UserInfoServiceClient client = new UserInfoServiceClient();
3、客户端代理
<pre name="code" class="csharp"> ChannelFactory<IBLL.IUserInfoService> channelFactory =new ChannelFactory<IBLL.IUserInfoService>("BLL.UserInfoService");//创建一个通信工厂,需要指定通信的节点(EndPoint),在构建多个通信工厂时,参数要保持一致,这样能很好的利用缓存
{
for(int i=0;i<3000;i++){
IBLL.IUserInfoService channel=channelFactory.CreateChannel()//通过通信工厂创建通信信道
int sum=channel.Add(6,7);
Response.Write(sum.ToString());
((IClientChannel)channel).close();//关闭通信信道
}
}
这种方式开销比较小
{}
三 、WCF中的契约
以上介绍的都是服务契约[ServiceContract]
还有数据契约 [DataContract] 用在调用实体模型(Model)中传输数据的时候,给模型加上[DataContract] 方便序列化进行传输
消息契约[MessageContract] 指定数据成员为SOAP消息头 或者将指定成员序列化成SOAP正文中的元素 不设置的话默认都放在消息体中