我們正在研究從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。 我已經多次重複這個測試,得到了類似的發現。
任何人都有同樣的發現?
我發佈了這個相同的問題,在微軟的論壇,並得到了很好的迴應。以下是指向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
它看起來像ASP.net web api更適合REST web服務。性能下降在REST的WCF框架內。 WCF非常適合SOAP,但不適用於REST。在使用ASP.net web API上的REST進行相同的測試後,我注意到它表現更好。 – ptn77