wcf的创建和基本常识
刚进公司就在做wcf接口的调试,不过一直就是数据对接,没有详细的总结一下,最近不忙,也在看Wcf的书,就试着来总结一下自己看看。
一.wcf和asmx的区别:
项目里面有两种webservice的实现方式:wcf和asmx,按照官方的说法,wcf是asmx的升级,支持多种协议,扩展性更好,也顺便说一下我对这两种方式的理解,使用asmx中的方法,要声明一个webMethod的特性,前台使用ajax调用后台方法的时候,就可以用这种实现方式:http://msdn.microsoft.com/zh-cn/library/bb398998(v=vs.90).aspx,跟调用静态方法的实现方式是一样的,对于js直接使用webservice的这种情况,我觉得还是asmx比较易用,不知道更合理的实现方式应该是什么,欢迎大家讨论。
二.创建一个简单的wcf服务端程序:
1.新建wcf服务应用程序:
![](http://images0.cnblogs.com/blog/336942/201412/031440594517231.png)
2.新建完成之后会自动类和接口的文件,IService1定义接口供客户端调用,Service1.svc.cs负责实现,同时,web.config文件中会有一个system.serviceModel的节点,这个节点下可以设置wcf的各种属性。
![](http://images0.cnblogs.com/blog/336942/201412/031441369209316.png)
默认使用vs开发服务器自动分配端口,可以在项目属性中修改,也可以使用iiis:
![](http://images0.cnblogs.com/blog/336942/201412/031442054983854.png)
这里说一下,寄宿方式有很多种,这里演示的只是最简单的寄宿方式,作为一个入门,事实上,契约,服务和寄宿是应该分开的,这里是把它集成到了一起,进阶一点的还是看A大的文章吧,讲的很好,点这里。
三.常用的特性的含义:
接下来看一下生成的文件中的特性:
IService1:
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。 [ServiceContract] public interface IService1 { [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); // TODO: 在此添加您的服务操作 } // 使用下面示例中说明的数据约定将复合类型添加到服务操作。 [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } }
使用ServiceContract来声明一个类,使用OperationContract来声明具体的操作,使用DataContract来声明实体类的数据,使用DataMember来声明类中的属性,使用
IgnoreDataMember声明不需要序列化的属性(外部访问不了),使用KnownType声明可以把继承的类代入到契约中。
Service.svc.cs文件中就是具体的接口实现了,跟一般的类没什么区别,这里就不说了。
四.客户端的调用:
在客户端程序中添加服务引用:
![](http://images0.cnblogs.com/blog/336942/201412/031505493736952.png)
客户端程序的web.config文件中添加了system.serviceModel节点,默认使用的是basichttp的绑定方式,然后就是client下面的endpoint了,终结点包括了地址、绑定、契约三个要素,访问的地址是由这个地址(address)和基址(baseaddress)共同组成的,不过这个默认没有设置基址。binding(绑定)的这个basicHttpBinding可以设置绑定的属性,超时时间和传输数据大小限制之类的,maxReceivedMessageSize这个属性是用的比较多的,默认值是65535,数据量大的时候需要修改。contract(契约)就是服务端的契约接口。
![](http://images0.cnblogs.com/blog/336942/201412/031513059204083.png)
对于服务的调用:
public Main() { using (Service1Client sc = new Service1Client()) { } }
通过引用生成的服务端的类,会在后面加上Client(Service1+Client),还可以用对象浏览器查看服务引用来查看客户端生成的引用中类的名字。
一般正式的项目不会这么用,公司里用的是IIS的寄宿,WCF服务应用程序中把契约和实现分离出去(放到WCF服务库中),只留下svc文件,设置ServiceHost节点下的Service属性:
![](http://images0.cnblogs.com/blog/336942/201412/031636261393922.png)
WCF中要学的东西还是很多,使用http协议的速度好像确实是个问题,但是配置成tcp协议访问不了,需要找点资料看看了。