2013-05-16 36 views
2

我們正在研究從SOAP webservices切換到REST是否值得。我創建了一個REST Web服務具有以下信息:WCF rest vs SOAP webservice之間的性能差異不明

[ServiceContract] 
public interface IRestServiceImpl 
{ 
    [OperationContract] 
    [WebInvoke(Method = "PUT", ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "Execute")] 
    ExecuteResponse Execute(ExecuteRequest request); 

    [OperationContract] 
    [WebInvoke(Method = "PUT", ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Bare, 
     UriTemplate = "ExecutePutJSON")] 
    ExecuteResponse ExecutePutJSON(ExecuteRequest request); 
} 

背後的實現代碼(RestServiceImpl.svc.cs)如下:

public class RestServiceImpl : IRestServiceImpl 
{ 
    public ExecuteResponse Execute(ExecuteRequest request) 
    { 
     //processing code that returns ExecuteResponse 
    } 

    public ExecuteResponse Execute(ExecuteRequest request) 
    { 
     //processing code that returns ExecuteResponse 
    } 
} 

的RestServiceImpl.svc如下:

<%@ ServiceHost Language="C#" Debug="true" Service="CICJIS.IWS.RestServiceImpl" 
CodeBehind="RestServiceImpl.svc.cs" %> 

在Web.config:

<configuration> 
    <system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
     switchValue="Information, ActivityTracing"> 
     <listeners> 
      <add name="messages" /> 
     </listeners> 
    </source> 
    <source name="System.ServiceModel.MessageLogging"> 
    <listeners> 
     <add name="messages" /> 
    </listeners> 
    </source> 
</sources> 
<sharedListeners> 
    <add name="messages" 
    type="System.Diagnostics.XmlWriterTraceListener" 
    initializeData="C:\Logs\RestService.svclog" /> 
</sharedListeners> 
<trace autoflush="true" /> 
</system.diagnostics> 
<system.web> 
    <compilation debug="true" defaultLanguage="c#" targetFramework="4.0" /> 
    <httpRuntime maxRequestLength="999999" maxQueryStringLength="999999" 
    executionTimeout="999"/> 
</system.web> 
<system.serviceModel> 
    <diagnostics> 
     <messageLogging 
     logEntireMessage="true" 
     logMalformedMessages="true" 
     logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="true" 
     maxMessagesToLog="3000" 
     maxSizeOfMessageToLog="10000000" /> 
    </diagnostics> 

    <services> 
     <service name="RestServiceImpl" behaviorConfiguration="ServiceBehavior"> 
     <endpoint address="" binding="webHttpBinding" contract="IRestServiceImpl" 
      behaviorConfiguration="web"> 

     </endpoint> 
     </service> 
    </services> 

    <behaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 

     <serviceBehaviors> 
     <behavior name="ServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

後面的實現代碼與SOAP webservice做同樣的事情並返回相同的ExecuteResponse對象。 我通過fiddler獲取了兩項服務,以獲得獲取響應所需時間的統計數據。 SOAP webservice使用ws-security,但REST webservice沒有實現任何安全性。 我發現SOAP webservice的返回速度比REST webservice快得多。

我不確定如果我們的情況可能不適合REST服務,或者我可能錯誤地實現了REST Web服務? 我也嘗試調試REST和SOAP服務,發現當它在方法中斷時,兩種方法中的處理代碼以相同的速率完成,但響應返回到REST客戶端所需的時間比SOAP客戶端。序列化對象時,REST的WCF API可能比SOAP的WCF API慢嗎?

以下是從提琴手的統計信息的一個例子:

對於SOAP: 請求計數:1個 發送字節:13693(標題:299;體:13394) 接收的字節:2651288(標題:235 ;體:2651053) ClientConnected:16:12:39.775 ClientBeginRequest:16:12:39.775 GotRequestHeaders:16:12:39.775 ClientDoneRequest:16:12:40.120 確定網關:0毫秒 DNS查找:0毫秒 TCP/IP連接:1ms HTTPS握手:0ms ServerConnected:16:12:40.122 FiddlerBeginRequest:16:12:40.122 ServerGotRequest:16:12:40.122 ServerBeginResponse:16:12:40.123 GotResponseHeaders:16:13:25.744 ServerDoneResponse:16:13:26.863 ClientBeginResponse :16:13:25.744 ClientDoneResponse:16:13:26.863 總體消逝:00:00:47.0877083 應用/肥皂+ XML:2651053 〜標題〜:235

對於REST: 請求計數:1 發送的字節數:2,369(標題:298;體:2071) 接收的字節:1982735(標題:230;體:1982505) ClientConnected:16:12:07.728 ClientBeginRequest:16:12:32.427 GotRequestHeaders:16:12:32.427 ClientDoneRequest:16點十二分32秒。428 確定網關:0毫秒 DNS查找:0毫秒 TCP/IP連接:2ms的 HTTPS握手:0毫秒 ServerConnected:16:12:32.430 FiddlerBeginRequest:16:12:32.430 ServerGotRequest:16:12:32.431 ServerBeginResponse: 16:12:32.435 GotResponseHeaders:16:20:06.914 ServerDoneResponse:16:20:07.889 ClientBeginResponse:16:20:06.914 ClientDoneResponse:16:20:07.889 總體消逝: 00:07:35.4626091 應用/ xml:1,982,505 〜標題〜:230

這兩個服務之間的最大區別在於ServerBeginResponse到GotResponseHeaders。 我已經多次重複這個測試,得到了類似的發現。

任何人都有同樣的發現?

+0

我發佈了這個相同的問題,在微軟的論壇,並得到了很好的迴應。以下是指向Microsoft討論的鏈接:http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/a4b10fac-cc7d-48d6-81ee-b798b2062927/ http://stackoverflow.com/questions/4163066/rest-vs-soap-has-rest-a-better-performance – ptn77

+0

它看起來像ASP.net web api更適合REST web服務。性能下降在REST的WCF框架內。 WCF非常適合SOAP,但不適用於REST。在使用ASP.net web API上的REST進行相同的測試後,我注意到它表現更好。 – ptn77

回答

1

它可能取決於用於實現REST服務的框架。 我最近在基於JAXWS RI(Metro)的應用程序中工作,然後將它移植到JAX RS(Jersey)框架中。 我可以得到更好的響應時間每休息服務電話爲基礎的實施

+0

這就是我發現的。看起來像ASP.net Web API比REST更適合REST。 – ptn77