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입니다. 나는이 테스트를 여러 번 반복했고 유사한 결과를 얻었다.
누구나 동일한 경험을 할 수 있습니까?
나는이 질문을 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
ASP.net 웹 API가 REST 웹 서비스에 더 적합하다고 보입니다. 성능 저하는 REST의 WCF 프레임 워크 내에서 발생합니다. WCF는 SOAP에는 좋지만 REST에는 적합하지 않습니다. ASP.net 웹 API에서 REST를 사용하여 동일한 테스트를 수행 한 후 훨씬 더 나은 성능을 보였다. – ptn77