2013-05-16 3 views
2

SOAP 웹 서비스에서 REST로 전환 할 가치가 있는지 여부를 조사 중입니다. 나는 다음과 같은 정보와 REST의 웹 서비스를 만들었습니다WCF 나머지 웹 서비스와 SOAP 웹 서비스 간의 예상 할 수없는 성능 차이

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은 다음과 같다 :

를 다음과 같이

[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)입니다

<%@ 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 웹 서비스와 동일한 기능을 수행하며 동일한 ExecuteResponse 객체를 반환합니다. 응답을 되 찾는 데 걸린 시간에 대한 통계를 얻기 위해 피들러를 통해 두 가지 서비스를 사용했습니다. SOAP 웹 서비스는 ws-security를 ​​사용하지만 REST 웹 서비스에는 보안이 구현되어 있지 않습니다. 내가 발견 한 것은 SOAP 웹 서비스가 REST 웹 서비스보다 훨씬 빨리 응답을 반환한다는 것입니다.

시나리오가 REST 서비스에 적합하지 않거나 REST 웹 서비스가 잘못 구현 된 것인지 잘 모르겠습니다. 또한 REST와 SOAP 서비스를 모두 디버깅 해봤는데 메서드에서 중단되면 두 메서드의 처리 코드가 같은 속도로 완료되지만 응답이 REST 클라이언트로 돌아 오는 데 오랜 시간이 걸리는 것을 발견했습니다. SOAP 클라이언트. 객체를 직렬화 할 때 REST의 WCF API가 SOAP의 WCF API보다 느릴 가능성이 있습니까? 비누

:

는 다음의 바이올린의 기록의 예 요청 개수 : 1 바이트 전송 : 13,693 (헤더 : 299; 본체 : 13,394)을받은 바이트 : 2,651,288 (헤더 : 235 12 :] 체 : 2,651,053) ClientConnected 16 39.775 ClientBeginRequest : 16 : 12 : 39.775 GotRequestHeaders : 16 : 12 : 39.775 ClientDoneRequest : 16 : 12 : 40.120 결정 게이트웨이 : 에선 0ms DNS 조회 : 에선 0ms TCP/IP 연결 : 1ms HTTPS 핸드 셰이크 : 0ms,451,515,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 애플리케이션/SOAP + XML : 2,651,053 는 ~ 헤더 ~ : 235 나머지의

: 요청 개수 : 1 전송 된 바이트 수 : 2,369 (헤더 : 298; 본체 : 2,071)을받은 바이트 : 1,982,735 (헤더 : 230 본체 : 1,982,505) ClientConnected : 16 : 12 : 07.728 ClientBeginRequest : 16 : 12 : 32.427 GotRequestHeaders : 16 : 12 : 32.427 ClientDoneRequest : 16시 12분 32초 .428 게이트웨이를 결정 에선 0ms DNS 조회를 : 에선 0ms TCP/IP 연결을 : 2ms의 HTTPS 핸드 셰이크 : 에선 0ms ServerConnected : 16 : 12 : 32.430 FiddlerBeginRequest : 16 : 12 : 32.430 ServerGotRequest : 16 : 12 : 32.431 ServerBeginResponse : 12 : 16 : 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 포럼에 올렸고 많은 반응을 얻었습니다. 다음은 Microsoft 토론으로 연결되는 링크입니다. http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/a4b10fac-cc7d-48d6-81ee-b798b2062927/ http://stackoverflow.com/questions/4163066/rest-vs-so-has-better-performance – ptn77

+0

ASP.net 웹 API가 REST 웹 서비스에 더 적합하다고 보입니다. 성능 저하는 REST의 WCF 프레임 워크 내에서 발생합니다. WCF는 SOAP에는 좋지만 REST에는 적합하지 않습니다. ASP.net 웹 API에서 REST를 사용하여 동일한 테스트를 수행 한 후 훨씬 더 나은 성능을 보였다. – ptn77

답변

1

REST 서비스를 구현하는 데 사용되는 프레임 워크에 따라 다를 수 있습니다. 최근 JAXWS RI (Metro) 기반 애플리케이션에서 작업 한 후 JAX RS (Jersey) 프레임 워크로 이식했습니다. 나머지 기반 구현에 대한 서비스 요청 당 더 나은 응답 시간을 얻을 수 있습니다.

+0

이것은 내가 발견 한 것입니다. ASP.net 웹 API가 WCF보다 REST에 더 좋습니다. – ptn77