Производительность прокси сервиса REST против прокси WCF SOAP - PullRequest
2 голосов
/ 19 марта 2012

Я получаю результаты производительности, которые не могу объяснить при сравнении клиента, который использует службу 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 превосходил REST со скоростью 5: 1, а по сети SOAP все еще превосходил REST примерно на 50%.

Я не понимаю, почему существует такая большая разница.

1 Ответ

4 голосов
/ 19 марта 2012

Разница в том, что вы используете привязку.Вы используете net.tcp в качестве протокола для своей службы SOAP, которая использует собственный двоичный формат для передачи сообщений.Это означает, что технологии, не относящиеся к WCF, не смогут подключаться к вашему сервису.WebHttp используется для службы REST, которая будет намного более совместима с другими (не .NET) технологиями, но не будет иметь такую ​​же производительность.

Если вы хотитеДля лучшего сравнения производительности SOAP и REST «яблоки с яблоками» используйте WsHttpBinding или BasicHttpBinding для службы SOAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...