在比较使用REST服务和SOAP服务的客户端时,我一直在获得无法解释的性能结果。我所做的是创建一个服务代理,如下所示:
REST:
WebHttpBinding webBinding = new WebHttpBinding();
webBinding.AllowCookies = true;
webBinding.MaxReceivedMessageSize = int.MaxValue;
CustomBinding custom = new CustomBinding(webBinding);
WebMessageEncodingBindingElement webMEBE = custom.Elements.Find<WebMessageEncodingBindingElement>();
webMEBE.ContentTypeMapper = new MyMapper();
webMEBE.ReaderQuotas.MaxArrayLength = int.MaxValue;
var factory = new WebChannelFactory<ITest>(custom, new Uri("http://localhost/Test"));
var proxy = factory.CreateChannel();
SOAP:
endPointAddr = "net.tcp://" + textBox2.Text +
":8909/MyService";
tcpBinding = new NetTcpBinding();
tcpBinding.MaxReceivedMessageSize = int.MaxValue;
tcpBinding.ReaderQuotas.MaxArrayLength = int.MaxValue;
tcpBinding.TransactionFlow = false;
tcpBinding.Security.Transport.ProtectionLevel =
System.Net.Security.ProtectionLevel.EncryptAndSign;
tcpBinding.Security.Transport.ClientCredentialType =
TcpClientCredentialType.Windows;
tcpBinding.Security.Mode = SecurityMode.None;
endpointAddress =
new EndpointAddress(endPointAddr);
IService1 proxy =
ChannelFactory<IService1>.CreateChannel(tcpBinding, endpointAddress);
IService1
和ITest
都有一个我使用的方法GetRequest()
,它返回一个~300Kb的对象。 IService1.GetRequest()是一个OperationContract,ITest.GetRequest()是一个WebGet。
在两种情况下打开通道后,我运行了一个紧密的proxy.GetRequest()循环,以确定每个可以处理的请求数。结果是,如果测试是在本地机器上,那么SOAP在5:1时的性能优于REST,而在网络上,SOAP仍然比REST高出约50%。
我不明白为什么会有这么大的差异。
答案 0 :(得分:4)
不同之处在于您正在使用的绑定。您使用net.tcp
作为SOAP服务的协议,它使用专有的二进制格式来传输消息。这意味着非WCF技术将无法连接到您的服务。 WebHttp
用于REST服务,它将与其他(非.NET)技术更加兼容,但不会具有相同的性能。
如果您希望对SOAP与REST性能进行更好的“对苹果”比较,请为您的SOAP服务使用WsHttpBinding
或BasicHttpBinding
。