说说Windows通信基础(WCF)
目录
【引言】... 2
【概述】... 2
【架构方面】... 2
【终端】... 3
【行为】... 3
【互操作性】... 4
【示例】... 4
创建一个Web端点... 4
使用标有ServiceContractAttribute、WebInvokeAttribute和WebGetAttribute属性的接口来定义服务合同。 4
实现一个服务合约类... 4
装载该服务... 5
通过C#应用程序... 5
创建一个WebServiceHost对象。... 5
添加一个带有WebHttpBehavior的ServiceEndpoint。... 5
="https://zhuanlan.zhihu.com/write#_Toc39930838">注意默认行为:... 5
打开服务,用户按回车键可以退出。... 6
通过IIS. 6
测试服务... 6
浏览器地址栏测试Get操作... 6
使用应用程序代码测试... 6
【小结】... 7
![ae983c64cc472652c1260d8d7ca023e5.png](https://i-blog.csdnimg.cn/blog_migrate/008c63b779acc261d21a353bc6ffbd92.png)
【引言】
有朋友问到WCF相关的问题。我们就通过这篇文章来了解一下。
【概述】
Windows Communication Foundation (WCF),以前称为Indigo,是.NET框架中的一个免费的开源运行时环境和一组API,用于构建畅通的、面向服务的应用程序。
【架构方面】
WCF是一个经常被用来实现和部署面向服务架构(SOA)的工具。它是利用面向服务的架构原理设计的,支持分布式计算,其中服务可能是远程应用。
客户端可以调用多个服务;
服务可以被多个客户端调用。
服务之间是松散耦合的。
服务通常有一个 WSDL 接口(Web 服务描述语言),任何WCF 客户端都可以使用该接口来调用服务,而不关心该服务托管在哪个平台上。
WCF实现了许多高级Web服务(WS)标准,如WS-Addressing、WS-ReliableMessaging和WS-Security。
随着.NET Framework 4.0的发布,WCF还提供了RSS Syndication Services、WS-Discovery、路由以及对REST服务的更好支持。
【终端】
一个WCF客户端通过一个端点连接到一个WCF服务。
每个服务都通过一个或多个端点共享合约功能。
一个端点有一个地址(它是一个指定端点可以访问的URL)和绑定属性,指定了数据的传输方式。
符号 "ABC "可以用来表示地址/绑定/契约。
绑定指定使用什么通信协议来访问服务,是否使用安全机制等等。
WCF包含了大多数常见的通信协议的预定义绑定,如SOAPover HTTP、SOAP over TCP和SOAPover Message Queues等。
WCF端点和客户端之间的交互可通过SOAP包来完成的,也可以通过XML和Json数据。
SOAP包采用简单的XML形式,这使得WCF与平台无关。
当客户端想通过端点访问服务时,不仅需要知道合约,还必须遵守端点指定的绑定。
因此,客户端和服务器都必须有兼容的端点。
随着2007年11月.NETFramework 3.5的发布,微软发布了一个编码器,在WCF中增加了对JSON序列化格式的支持。
【行为】
行为包括如下类型:修改,扩展服务,扩展客户端功能。行为允许开发人员创建自定义处理、转换或检查,当消息发送或接收时用来规范消息。行为的一些使用例子有:
· 控制元数据是否与服务一起发布。
· 为服务添加安全功能,如冒名顶替、授权或管理令牌等。
· 记录信息,如跟踪、追踪或记录信息。
· 消息或参数验证
· 当接收到消息时,调用所有额外的操作----例如当某些消息到达时通知用户。
行为实现了用于服务扩展的IServiceBehavior接口、用于端点的IEndpointBehavior、用于服务合同的IContractBehavior接口、或用于操作的IOperationBehavior。
服务行为用来规范整个服务的消息处理,而不是针对单个操作的处理。
【互操作性】
WCF支持与在同一台Windows机器上运行的WCF应用程序或
在不同的Windows机器上运行的WCF或
在Windows及其他操作系统上运行的Java等平台上构建的标准Web服务
的互操作性。
除了SOAP之外,WCF 4还支持非SOAP的XML、RSS、JSON、JSON和二进制格式,通过HTTP或HTTPS进行外部通信。
【示例】
创建一个Web端点
使用标有ServiceContractAttribute、WebInvokeAttribute和WebGetAttribute属性的接口来定义服务合同。
![605150e47a487d39a78366c8daf4a0f3.png](https://i-blog.csdnimg.cn/blog_migrate/e529ddd31ec2838a424fbe249517d194.png)
默认情况下,WebInvokeAttribute 使用POST操作。但是,您可以通过指定一个 "method="参数来指定要操作的HTTP方法(例如,HEAD、PUT或DELETE)。WebGetAttribute没有"method="参数,只有GET操作。
实现一个服务合约类
![642fe46894975b893f9d6344ab4c10ff.png](https://i-blog.csdnimg.cn/blog_migrate/cd6cee66ad595592cae19d92c94b4911.png)
装载该服务
通过C#应用程序
创建一个WebServiceHost对象。
![5b07318c62ab49911bd861ad2c41b1d1.png](https://i-blog.csdnimg.cn/blog_migrate/6929b928a8eaa167758891b3dc4a9318.png)
添加一个带有WebHttpBehavior的ServiceEndpoint。
![869ba87c557a0ef740ec8e301c8ac5d3.png](https://i-blog.csdnimg.cn/blog_migrate/5d4fa93b5fc25f9a3ccc6e353d5a1b03.png)
注意默认行为:
如果不添加端点,WebServiceHost会自动创建一个默认端点。WebServiceHost 还会添加WebHttpBehavior,并禁用 HTTP 帮助页面和Web 服务描述语言 (WSDL) GET 功能,因此元数据端点不会干扰默认的HTTP 端点。
当尝试调用端点上的操作时,添加一个URL为""的非SOAP端点会导致意外行为。原因是端点的监听URI与帮助页面的URI(当你浏览到WCF服务的基本地址时显示的页面)相同。
您可以采取以下操作之一来防止这种情况的发生。
· 始终为非SOAP端点指定一个非空白URI。
· 关闭帮助页面。这可以通过下面的代码关闭帮助页面:
![59dbece577c598e8a7a696f0e42e7b73.png](https://i-blog.csdnimg.cn/blog_migrate/957bfa1cfb0dc6f5fecdd03cb84c5dd3.png)
打开服务,用户按回车键可以退出。
![1838f27311467948d8b05e3d652517ee.png](https://i-blog.csdnimg.cn/blog_migrate/f4e6feda55d62d5a74e81b7e12066dec.png)
通过IIS
![59d4efb8b5e2e03c183e889fea636c17.png](https://i-blog.csdnimg.cn/blog_migrate/276bd9aadf652c92d38262fb2c284390.png)
测试服务
浏览器地址栏测试Get操作
"http://localhost:8000/EchoWithGet?s=Hello,World!"
使用应用程序代码测试
![1e3fcb3db71f2a275c3c8227d61d9bcd.png](https://i-blog.csdnimg.cn/blog_migrate/6f65e7149d7a5098e04c3dec00be2c61.png)
【小结】
通过Windows Communication Foundation (WCF)我们可以创建Web端点服务。这些Web端点可以通过XML或JSON发送数据。
本文从架构方面,终端,行为和互操作性等方面对WCF进行了介绍,希望对大家有所裨益。
欢迎打赏提问。
想联系丁哥开讲,关注动态,可通过如下途径:
微信公众号,知乎,b站,油管,今日头条。