BasicHttpBinding与WsHttpBinding的比较

在Windows Communication Foundation (WCF)中,有多种绑定和协议可供选择。本文将专注于两种看似相似但实际上有重大区别的协议:BasicHttpBinding和WsHttpBinding。将首先讨论它们之间的差异,然后通过创建一个小型项目来实际观察这些差异。

如果是WCF的新手,请先阅读以下链接中的基础知识。本文不包括WCF的基础知识:

BasicHttpBinding与WsHttpBinding的差异

简而言之,WsHttpBinding与BasicHttpBinding之间的主要区别在于WsHttpBinding支持WS-*规范。WS-*规范是扩展Web服务功能的一系列标准。

以下是从安全性、兼容性、可靠性和SOAP版本的角度对两者的详细比较表:

标准 BasicHttpBinding WsHttpBinding
安全性支持 支持旧的ASMX风格,即WS-BasicProfile 1.1。 使用WS-*规范公开Web服务。
兼容性 面向没有安装.NET 3.0的客户端,支持更广泛的客户端。许多客户端如Windows 2000仍然不运行.NET 3.0。因此,较旧版本的.NET可以消费此服务。 由于它是基于WS-*规范构建的,因此不支持广泛的客户端,不能被低于3版本的旧.NET版本消费。
SOAP版本 SOAP 1.1 SOAP 1.2和WS-Addressing规范。
可靠消息传递 不支持。换句话说,如果客户端发起两个或三个调用,真的不知道它们是否会以相同的顺序返回。 支持,因为它支持WS-*规范。
默认安全选项 默认情况下,当客户端调用发生时,消息没有提供安全性。换句话说,数据以纯文本形式发送。 由于WsHttpBinding支持WS-*,它默认启用了WS-Security。因此,数据不是以纯文本形式发送的。
安全选项 Windows - 默认身份验证基本证书无传输消息传输带消息凭据

可能已经注意到的最大区别是安全性方面。默认情况下,BasicHttpBinding以纯文本形式发送数据,而WsHttpBinding以加密和安全的方式发送数据。为了演示这一点,将创建两个服务,一个使用BasicHttpBinding,另一个使用WsHttpBinding,然后将更详细地查看安全性方面。

实际比较BasicHttpBinding和WsHttpBinding的五个步骤

为了理解这些实体之间的真正差异,将进行一个小项目。在这个项目中,将创建两个WCF服务,一个使用BasicHttpBinding,另一个使用WsHttpBinding。

首先,创建一个使用BasicHttpBinding的简单WCF项目,然后修改ServiceModel元素,如下所示。可以看到在endpoint标签中指定了basicHttpBinding作为协议。

<system.serviceModel> <services> <service name="WCFBasicHttpBinding.Service1" behaviorConfiguration="WCFBasicHttpBinding.Service1Behavior"> <!-- Service Endpoints --> <endpoint address="" binding="basicHttpBinding" contract="WCFBasicHttpBinding.IService1"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="WCFBasicHttpBinding.Service1Behavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>

不需要做任何特别的事情来创建使用WsHttpBinding的服务。默认情况下,WCF项目是使用WsHttpBinding创建的。以下是Web.config文件的样子。可以看到endpoint标签正在使用wsHttpBinding。

<system.serviceModel> <services> <service name="WCFWsHttpBindingHttps.Service1" behaviorConfiguration="WCFWsHttpBindingHttps.Service1Behavior"> <!-- Service Endpoints --> <endpoint address="" binding="wsHttpBinding" contract="WCFWsHttpBindingHttps.IService1"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="WCFWsHttpBindingHttps.Service1Behavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> </system.serviceModel>

将不会在两个服务中创建任何新方法。将只使用WCF模板创建的默认代码。因此,这两个服务都将有一个GetData函数,它返回一个字符串。GetData函数是WCF项目创建时默认创建的函数。

public class Service1 : IService1 { public string GetData(int value) { return string.Format("You entered: {0}", value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } }

现在服务已经创建好了,需要创建一个客户端来消费这个服务。因此,创建了一个简单的Web应用程序,并添加了两个引用,一个是服务引用,即WsHttpBinding,另一个是Web引用,即BasicHttpBinding。在这个示例中,使用了Web引用来添加BasicHttpBinding,但也可以使用Add Service Reference来完成。使用Add Web Reference只是为了证明BasicHttpBinding实际上与旧的Web服务向后兼容。

将在默认的ASPX页面上添加两个按钮。一个按钮将调用HTTP服务,另一个将调用WsHttp服务。以下是在两个按钮点击中调用GetData函数的方式。

现在已经准备好了完整的项目,是时候嗅探并查看在两种情况下客户端和服务之间如何传输数据了。让从这里下载一个简单的HTTP数据记录器。然后将依次点击两个按钮,并使用httpanalyzer记录数据传输。可以看到,对于基本HTTP协议,发布的数据是以简单的纯XML格式,而对于wshttp协议,它是以加密格式。

换句话说,尽可能避免使用BasicHttp。

何时使用BasicHttp和WsHttp的考虑因素

如果正在寻找向后兼容性并支持大量客户端,那么基本HTTP绑定是正确的选择,否则,如果看到客户端是在.NET 3.0及以上版本中制作的,WsHttp是一个不错的选择。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485