REST服务代理与WCF SOAP代理的性能

时间:2012-03-19 16:35:32

标签: c# rest soap

在比较使用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);

IService1ITest都有一个我使用的方法GetRequest(),它返回一个~300Kb的对象。 IService1.GetRequest()是一个OperationContract,ITest.GetRequest()是一个WebGet。

在两种情况下打开通道后,我运行了一个紧密的proxy.GetRequest()循环,以确定每个可以处理的请求数。结果是,如果测试是在本地机器上,那么SOAP在5:1时的性能优于REST,而在网络上,SOAP仍然比REST高出约50%。

我不明白为什么会有这么大的差异。

1 个答案:

答案 0 :(得分:4)

不同之处在于您正在使用的绑定。您使用net.tcp作为SOAP服务的协议,它使用专有的二进制格式来传输消息。这意味着非WCF技术将无法连接到您的服务。 WebHttp用于REST服务,它将与其他(非.NET)技术更加兼容,但不会具有相同的性能。

如果您希望对SOAP与REST性能进行更好的“对苹果”比较,请为您的SOAP服务使用WsHttpBindingBasicHttpBinding