WCF教程2
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
static void HostCalculatorSerivceViaConfiguration() { using (ServiceHost calculatorSerivceHost = new ServiceHost(typeof(Ge neralCalculatorService))) { calculatorSerivceHost.Opened += delegate { Console.WriteLine("Calculator Service has begun to listen }; ");
using (ServiceHost calc ulatorSerivceHost = new ServiceHost(typeof(Ge neralCalculatorService), httpBaseAddress, tcpBaseAddress)) { BasicHttpBinding httpBinding = new BasicHttpBinding(); NetTcpBinding tcpBinding = new NetTc pBinding();
calculatorSerivceHost.AddServiceEndpoint(typeof(IGeneralCalculator ), httpBinding, string.Empty); calculatorSerivceHost.AddServiceEndpoint(typeof(IGeneralCalculator ), tcpBinding, string.Empty);
calculatorSerivceHost.Opened += delegate {
ቤተ መጻሕፍቲ ባይዱ
Console.WriteLine("Calculator Service has begun to listen };
");
calculatorSerivceHost.Open();
Console.Read(); } }
o
Binding: Binding 实现在 Client 和 Service 通信的所有底层细节。 比如 Client 与 Service 之间传递的 Message 是如何编码的——text/XML, binary ,MTOM;这种 Message 的 传递是采用的哪种 Transport ——TCP, Http, Named Pipe, MSMQ; 以及采用怎样的 机制解决 Secure Messaging 的问题—— SSL , Message Level Security 。 所以 Binding 解决的是 How to communicate with service ?
/// <summary> /// Hosting a service using managed code without any configuraiton infor mation. /// Please note that the related configuration data should be removed befo re calling the method. /// </summary> static void HostCalculatorServiceViaCode() { Uri httpBaseAddress = new Uri("http://localhost:8888/generalCalculato r"); Uri tcpBaseAddress = new Uri("net.tcp://localhost:9999/generalCalcula tor");
calculatorSerivceHost.Open();
Console.Read(); } } } }
4. Service.svc: http://localhost/WCFService/ GeneralCalculatorService.svc
<%@ ServiceHost Language="C#" Debug="true " Service="Artech.WCFService.S ervice.GeneralCalculatorService" %>
namespace Artech.WCFService.Contract
{ [ServiceContract] public interface IGeneralCalculator { [OperationContract] double Add(double x, double y); } }
namespace Artech.WCFService.Client { class GeneralCalculatorClient:Client Base<IGeneralCalculator>,IGeneralCalcul ator { public GeneralCalculatorClient() : base() {}
ServiceMetadataBehavior behavior = calculatorSerivceHost.Descripti on.Behaviors.Find<ServiceMetadataBehavior>(); { if(behavior == null) { behavior = new ServiceMetadataBehavior(); behavior.HttpGetEnabled = true; calculatorSerivceHost.Description.Behaviors.Add(behavior); } else { behavior.HttpGetEnabled = true; } }
using System; using System.Collections.Generic; using System.Text; using System.ServiceModel; using Artech.WCFService.Contract; using Artech.WCFService.Service; using System.ServiceModel.Description;
5. Client: Artech.WCFService.Client/ GeneralCalculatorClient.cs & Program.cs
using System; using System.Collections.Generic; using System.Text; using System.ServiceModel; using System.ServiceModel.Channels; using Artech.WCFService.Contract;
Endpoint 的结构
Endpoint 包含以下 4 个对象:
o
Address: Address 通过一个 URI 唯一地标识一个 Endpoint ,并告诉潜在的 WCF service 的调用者如何找到这个 Endpoint 。所以 Address 解决了 Where to locate the WCF Service ?
1. Service Contract: Artech..WCfService.Contract/ServiceContract/IGene ralCa lculator.cs
using System; using System.Collections.Generic; using System.Text; using System.ServiceModel;
o
Behavior: Behavior 的主要作用是定制 Endpoint 在运行时的一些必要的 Behavior。 比如 Service 回调 Client 的 Timeout ;Client 采用的 Credential type ;以及是否支持 Transaction 等。
当我们 Host 一个 WCF Service 的时候, 我们必须给他定义一个或多个 Endpoint , 然后 service 通过这个定义的 Endpoint 进行监听来自 Client 端的请求。当我们的 Application 需要调用这 个 Service 的时候,因为 Client 和 Service 是通过 Endpoint 的进行通信的, 所以我们必须
为我们的 Application 定义 Client 端的 Endpoint 。只有当 Client 的 Endpoint 和 Service 端 某个 Endpoint 相互匹配(Service 端可以为一个 Service 定义多个 Endpoint ),Client 端的 请求才能被 Service 端监听到。也就是说,我们只有在 Client 具有一个与 Service 端完全匹配 的 Endpoint ,我们才能调用这个 Service。而这种匹配是比较严格的,比如从匹配 Address 方面, Client 端和 Service 端的 Endpoint Address 不仅仅在 URI 上要完全匹配 Service, 他 们的 Headers 也需要相互匹配。对于 Binding, 一般地,Client 需要有一个与 Service 端完全 一样的 Binding ,他们之间才能通信。
o
Contract: Contract 的主要的作用是暴露某个 WCF Service 所提供的所有有效的 Functionality 。从 Message Exchange 的层面上讲,Contract 实际上是抱每个 Operation 转化成为相对应的 Message Exchange Pattern——MEP (Request/Response ; One-way; Duplex)。所以 Contract 解决的是 What functionalities do the Service provide?
namespace Artech.WCFService.Hosting { class Program { static void Main(string[] args) { //HostCalculatorServiceViaCode(); HostCalculatorSerivceViaConfiguration(); }
[原创 ]我的 WCF 之旅( 2): Endpoint Overview WCF 实际上是构建了一个框架, 这个框架实现了在互联系统中各个 Application 之间如何通信。 使得 Developers 和 Architect 在构建分布式系统中,无需在考虑如何去实现通信相关的问题, 更加关注与系统的业务逻辑本身。而在 WCF Infrastructure 中,各个 Application 之间的通 信是由 Endpoint 来实现的。
Sample
首先给一个 Sample,以便我们对在 WCF Service Aplication 中如何定义 Endpoint 有一个感 性的认识。整个 Solution 的结构参照下图,我的上一篇 Blog([ 原创] 我的 WCF 之旅(1 ):创 建一个简单的 WCF 程序 )中有详细的介绍。你也可以通过后面的 Link 下载相应的 Source Code(/files/artech/Artech.WCFService.zip )
2. Service: Artech.WCFSerice.Service/GeneralCa lculatorService.cs
using System; using System.Collections.Generic; using System.Text;
using Artech.WCFService.Contract;
namespace Artech.WCFService.Service { public class GeneralCalculatorService:IGeneralCalculator { IGeneralCalculator Members } }
3. Hosting: Artech.WCFService.Hosting/Program.cs