多协议绑定的WCF服务实现

在现代的软件开发中,服务的灵活性和可扩展性是至关重要的。WCF(Windows Communication Foundation)提供了一种机制,允许开发者根据需要为服务配置不同的绑定。不同的绑定可以支持不同的通信协议和数据格式,使得同一个服务可以被不同平台和应用程序所使用。本文将介绍如何在同一个WCF服务中实现多种协议绑定,包括基本HTTP绑定、WS-*协议和REST协议,以及如何在客户端应用程序中使用这些绑定。

现实场景

假设有一个组织“ABC”开发了一个WCF服务。现在,另一个组织“X”正在开发一个Silverlight应用程序,并且想要使用这个服务。因此,组织“ABC”配置了WCF服务,使用基本HTTP绑定以便在Silverlight应用程序中使用。几天后,另一个组织“Y”正在开发一个ASP.NET Web应用程序,并且想要使用WS-*协议来使用这个服务。于是,组织“ABC”引入了wsHttp绑定以满足ASP.NET应用程序的需求。再然后,组织“Z”正在开发一个基于JAVA的Web应用程序,并且想要以REST方式使用这个服务,他们希望服务的响应不是以典型的XML格式,而是以JSON格式。组织“ABC”通过引入新的webHttp绑定来满足这个需求。

实现不同绑定的WCF服务

为了实现上述概念,将开发一个简单的WCF服务项目。这个WCF服务有一个单一的方法GetData()。

打开web.config文件并检查ServiceModel元素。如果没有在配置文件中定义绑定,WCF默认会暴露基本HTTP绑定。一旦想要暴露多个绑定,需要在配置文件中明确定义基本HTTP绑定。以下是定义基本HTTP绑定的示例:

<system.serviceModel> <services> <service name="YourNamespace.YourService"> <endpoint address="" binding="basicHttpBinding" contract="YourNamespace.IServiceContract" /> </service> </services> </system.serviceModel>

为了引入wsHttp绑定,需要在web.config文件中添加以下条目:

<system.serviceModel> <services> <service name="YourNamespace.YourService"> <endpoint address="" binding="wsHttpBinding" contract="YourNamespace.IServiceContract" /> </service> </services> </system.serviceModel>

为了以REST方式使用WCF服务,首先需要在服务接口定义中引入一些属性。在REST中,可以通过查询字符串传递服务方法的参数值,并生成GET、POST、PUT、DELETE请求。这里,服务将通过HTTP GET请求被调用。此外,响应表示将采用JSON格式。打开IMyService.cs文件,并使用WebGet属性和UriTemplate属性标记接口IMyService,如下所示:

[ServiceContract] public interface IMyService { [OperationContract] [WebGet(BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "data/{param}")] string GetData(string param); }

现在,需要引入一个端点,以便以REST方式使用服务。为此,需要定义一个带有webHttp绑定的端点行为,然后使用它作为绑定的端点行为。以下是修改web.config文件的示例:

<system.serviceModel> <services> <service name="YourNamespace.YourService"> <endpoint address="" binding="webHttpBinding" contract="YourNamespace.IServiceContract" behaviorConfiguration="webBehavior" /> </service> </services> <behaviors> <endpointBehaviors> <behavior name="webBehavior"> <webHttp /> </behavior> </endpointBehaviors> </behaviors> </system.serviceModel>

使用服务

添加一个Windows Forms应用程序项目,并在表单上添加三个按钮。每个按钮点击将使用不同的绑定调用服务。右键单击引用->添加服务引用。点击发现或在地址框中输入服务URL。

一旦点击确定,将生成存根代码。打开Form1.cs并添加以下命名空间:

using System.ServiceModel; using System.ServiceModel.Web; using System.ServiceModel.Channels;

实现以下代码以在表单按钮中使用基本HTTP绑定调用服务:

private void btnBasicHttp_Click(object sender, EventArgs e) { BasicHttpBinding binding = new BasicHttpBinding(); EndpointAddress address = new EndpointAddress("http://localhost:8733/Design_Time_Addresses/YourService/YourService/"); ChannelFactory factory = new ChannelFactory(binding, address); IMyService service = factory.CreateChannel(); string result = service.GetData("some data"); MessageBox.Show(result); }

实现以下代码以在表单按钮中使用wsHttp绑定调用服务:

private void btnWsHttp_Click(object sender, EventArgs e) { wsHttpBinding binding = new wsHttpBinding(); EndpointAddress address = new EndpointAddress("http://localhost:8733/Design_Time_Addresses/YourService/YourServiceWsHttp/"); ChannelFactory factory = new ChannelFactory(binding, address); IMyService service = factory.CreateChannel(); string result = service.GetData("some data"); MessageBox.Show(result); }

可以以多种方式调用REST WCF服务,例如使用HTML表单中的get方法或使用XMLHttpRequest。这里使用WCF代理调用它。添加以下两个引用:

using System.Net; using System.IO;

实现以下代码以在表单按钮中使用web绑定调用服务:

private void btnWebHttp_Click(object sender, EventArgs e) { WebClient client = new WebClient(); string result = client.DownloadString("http://localhost:8733/Design_Time_Addresses/YourService/YourServiceWebHttp/data/some%20data"); MessageBox.Show(result); }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485