内容简介:那天有个小孩教我WCF【1/31】
WCF整体系统学习,一周2016-11-11 -2016-11-17 开发环境vs2015 .net framework 4.0 触屏WPF教程暂时搁置
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
啥契约,来说都是一个接口,在C#中,接口拓展一个类的行为,添加一个统一风格,到处收儿子。
服务,数据,消息
我想花费31天,系统学习WCF,跟上脚步,修炼 内功
DEMO1
WCF的项目一般分为 客户端,服务端,启动服务端的工具(控制台,服务,winform,wpf等,简称Host),一般来说,最好是winform,因为简单,或者好看的话,用wpf,ayui开发客户端快而且好看。
用cs程序,可以做个wcf的服务管理器,也可以做个服务安装和卸载类似的管理工具。
增加IAYUIBuyService类库
主要引用,自己添加程序集引用
using System.Runtime.Serialization;
using System.ServiceModel;
OK,Contract这个单词是 契约的意思,就是你给客户端暴露的接口中,别人可以调用的方法名字。
新建接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.ServiceModel; namespace IAYUIBuyService { [ServiceContract] public interface IBuyService { [OperationContract] double GetPrice(int productId); } }
在interface上,用ServiceContract标记,一个operation范围,
在 method上,对外暴露的操作用OperationContract标记,表示对外暴露。
元数据:就是特征数据,好比有个美女,脸上有个美人痣,那个痣可以是个 数据,是她的特征
提取元数据,先用手工 svcutil.exe
位置:C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools
那下面有好几个版本,看你用的WCF版本了,我自己初学用4.0也就是8.0A的文件夹
VS2015,菜单栏: 工具-外部工具
下面勾选如下,点击确定
然后,编译那个类库
接着
点击那个工具,参数输入F:\SoftMgr\WCF\AYOrderSystem\IAYUIBuyService\bin\Debug\IAYUIBuyService.dll
我不喜欢很官方的介绍每个文件
第1个文件,wsdl文档,包含对xsd的引用,消息定义、端口类型和服务操作的信息,客户端知道后,根据这个生成服务端的代理文件,然后就可以智能提示地方式提示代码
第2个文件,方法特性的xsd Schema
第3个文件,简单刀net类型的标准XSD Schema
用notepad++打开 1文件
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <xsd:schema targetNamespace="http://tempuri.org/Imports"> <xsd:import namespace="http://tempuri.org/" /> <xsd:import namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> </xsd:schema> </wsdl:types> <wsdl:message name="IBuyService_GetPrice_InputMessage"> <wsdl:part name="parameters" element="tns:GetPrice" /> </wsdl:message> <wsdl:message name="IBuyService_GetPrice_OutputMessage"> <wsdl:part name="parameters" element="tns:GetPriceResponse" /> </wsdl:message> <wsdl:portType name="IBuyService"> <wsdl:operation name="GetPrice"> <wsdl:input wsaw:Action="http://tempuri.org/IBuyService/GetPrice" message="tns:IBuyService_GetPrice_InputMessage" /> <wsdl:output wsaw:Action="http://tempuri.org/IBuyService/GetPriceResponse" message="tns:IBuyService_GetPrice_OutputMessage" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DefaultBinding_IBuyService" type="tns:IBuyService"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="GetPrice"> <soap:operation soapAction="http://tempuri.org/IBuyService/GetPrice" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> </wsdl:definitions>
打开2文件
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://tempuri.org/" elementFormDefault="qualified" targetNamespace="http://tempuri.org/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="GetPrice"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="productId" type="xs:int" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="GetPriceResponse"> <xs:complexType> <xs:sequence> <xs:element minOccurs="0" name="GetPriceResult" type="xs:double" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
打开3文件
<?xml version="1.0" encoding="utf-8"?> <xs:schema xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="anyType" nillable="true" type="xs:anyType" /> <xs:element name="anyURI" nillable="true" type="xs:anyURI" /> <xs:element name="base64Binary" nillable="true" type="xs:base64Binary" /> <xs:element name="boolean" nillable="true" type="xs:boolean" /> <xs:element name="byte" nillable="true" type="xs:byte" /> <xs:element name="dateTime" nillable="true" type="xs:dateTime" /> <xs:element name="decimal" nillable="true" type="xs:decimal" /> <xs:element name="double" nillable="true" type="xs:double" /> <xs:element name="float" nillable="true" type="xs:float" /> <xs:element name="int" nillable="true" type="xs:int" /> <xs:element name="long" nillable="true" type="xs:long" /> <xs:element name="QName" nillable="true" type="xs:QName" /> <xs:element name="short" nillable="true" type="xs:short" /> <xs:element name="string" nillable="true" type="xs:string" /> <xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte" /> <xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt" /> <xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong" /> <xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort" /> <xs:element name="char" nillable="true" type="tns:char" /> <xs:simpleType name="char"> <xs:restriction base="xs:int" /> </xs:simpleType> <xs:element name="duration" nillable="true" type="tns:duration" /> <xs:simpleType name="duration"> <xs:restriction base="xs:duration"> <xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?" /> <xs:minInclusive value="-P10675199DT2H48M5.4775808S" /> <xs:maxInclusive value="P10675199DT2H48M5.4775807S" /> </xs:restriction> </xs:simpleType> <xs:element name="guid" nillable="true" type="tns:guid" /> <xs:simpleType name="guid"> <xs:restriction base="xs:string"> <xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}" /> </xs:restriction> </xs:simpleType> <xs:attribute name="FactoryType" type="xs:QName" /> <xs:attribute name="Id" type="xs:ID" /> <xs:attribute name="Ref" type="xs:IDREF" /> </xs:schema>
文件1和文件2生成,都跟源码有关,查看关系
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
WSDL => 接口名称+方法名称+输入消息/输出消息
端口类型 => 接口名字 operation就是方法名字
WCF就是根据这些特殊标记生成wsdl文档的。
服务实现
新建类库AYUIBuyService,新建类 BuyService
using System; using System.Collections.Generic; using System.Linq; using System.Text; using IAYUIBuyService; namespace AYUIBuyService { /// <summary> /// AYUI产品购买服务 /// 2016-11-13 23:08:32 /// </summary> public class BuyService : IBuyService { public double GetPrice(int productId) { switch (productId) { case 1: return 10; case 2: return 20; case 3: return 30; case 4: return 40; default: return 100; } } } }
服务启动需要的服务,也算是管理服务,也叫宿主
新建 AYUIServiceHost 控制台吧
作为一个宿主,需要引用需要管理的 接口(服务)和对应的实现,还有那2个 命名空间的dll
using System.Runtime.Serialization;
using System.ServiceModel;
基础模板
using System; using System.Collections.Generic; using System.Linq; using System.Text; using AYUIBuyService; namespace AYUIServiceHost { class Program { static void Main(string[] args) { Console.WriteLine("AYUI服务启动中..."); try { } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("服务启动成功"); Console.ReadLine(); } } }
此时运行还是错误的
添加配置文件 App.config
新建服务,然后点击浏览,找到那个实现层 dll
然后单击
点击下一步
点击下一步
这几种协议,我们后面讲区别,保持默认用Http
下一步,这一步是暴露给客户端,发现服务的地址,名字随便取的。端口号取没被占用的。
点击下一步
结果:
在WCF面试题中,ABC代表啥问的多,如果要客户端知道服务,需要Address,Binding,Contract即可,他们组成了endpoint,终结点。
打开App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <services> <service name="AYUIBuyService.BuyService"> <endpoint address="http://localhost:1111/AYUIBuyService" binding="basicHttpBinding" bindingConfiguration="" contract="IAYUIBuyService.IBuyService" /> </service> </services> </system.serviceModel> </configuration>
将basicHttpBinding改成wsHttpBinding ,注意大小写
然后,编译运行host,报错
如果你是管理员方式打开VS2015,就不会有这个问题了。我们可以直接,管理员方式打开Debug下的 AYUIServiceHost.exe
公开元数据,就是那些Contract标记的东西,生成了dll,然后客户端根据这些东西生成wsdl等东西
继续编辑app.config
新建服务行为 OpenMetaDataBehavior,单击添加
这里有很多行为
我们选中serviceMetadata
单击这个 列表项,设置如下,取个地址名字,让vs可以下载wsdl
此时我们创建了1个服务的行为。但是还没有指定。单击服务,然后指定服务的行为
接下来,app.config显示如下
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name="OpenMetaDataBehavior"> <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:1111/AYUIService/MEX" /> </behavior> </serviceBehaviors> </behaviors> <services> <service behaviorConfiguration="OpenMetaDataBehavior" name="AYUIBuyService.BuyService"> <endpoint address="http://localhost:1111/AYUIBuyService" binding="wsHttpBinding" bindingConfiguration="" contract="IAYUIBuyService.IBuyService" /> </service> </services> </system.serviceModel> </configuration>
服务行为,有个OpenMetaDataBehavior,取了名字
然后服务指定了这个行为。
我已经管理员方式打开了VS2015,然后F5运行Host,接着打开浏览器,输入 http://localhost:1111/AYUIService/MEX
这个地址,可以获得对外暴露的元数据。
客户端生成使用代码 -> 一开始创建的那个控制台,毫无疑问也可以是其他的 使用技术,例如非常屌的 WPF技术
WCF两种方式,一种自带 工具 生成代理文件,一种是 手动代码方式的代理
我们将客户端AYOrderSystem设为启动项目,然后进入AYUIServiceHost的Debug文件夹下,管理员方式运行host的exe
成功后,
右键客户端的引用文件夹,添加服务引用
输入地址http://localhost:1111/AYUIService/MEX, 点击 转到
修改客户端类的命名空间 为 OpenAYUIService
点击高级
修改集合类型, Array变为LinkedList
点击确定 2次,查看客户端生成的代码,点击显示所有文件
<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> <system.serviceModel> <bindings> <wsHttpBinding> <binding name="WSHttpBinding_IBuyService" /> </wsHttpBinding> </bindings> <client> <endpoint address="http://localhost:1111/AYUIBuyService" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IBuyService" contract="OpenAYUIService.IBuyService" name="WSHttpBinding_IBuyService"> <identity> <userPrincipalName value="DESKTOP-G213197\ay" /> </identity> </endpoint> </client> </system.serviceModel> </configuration>
打开客户端,编写调用服务端的代码
编写完DEMO如下
static void Main(string[] args) { using (OpenAYUIService.BuyServiceClient client = new OpenAYUIService.BuyServiceClient()) { Console.WriteLine(client.GetPrice(2)); } Console.ReadLine(); }
因为我服务端是另起的DEBUG下手动启动的,不是在VS启动的,vs只是生成。
到此我们完成了WCF的入门学习,后面慢慢加知识 学习。
服务端是随便部署到多台服务器的。或者单台,多个端口号OK了。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
推荐您阅读更多有关于“WCF,”的文章
以上所述就是小编给大家介绍的《那天有个小孩教我WCF【1/31】》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 消息队列解耦是骗小孩儿的
- 那天有个小孩教我WCF【3/31】
- 那天有个小孩教我WCF【2/31】
- 那天有个小孩教我WCF【3/31】
- 那天有个小孩教我WCF【2/31】
- 那天有个小孩教我WCF【1/31】
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。