繁体   English   中英

WCF Rest与SOAP Web服务之间无法解释的性能差异

[英]Unexplained performance difference between WCF rest vs SOAP webservice

我们正在探索从SOAP Web服务切换到REST是否值得。 我用以下信息创建了一个REST Web服务:

 [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 Web服务相同的操作,并返回相同的ExecuteResponse对象。 我通过提琴手使用了这两项服务,以获取获得回复所需时间的统计信息。 SOAP Web服务使用ws-security,但是REST Web服务未实现任何安全性。 我发现,SOAP Web服务比REST Web服务返回响应的速度要快得多。

我不确定我们所采用的方案是否不太适合REST服务,或者我是否正确实施了REST Web服务? 我还尝试调试REST和SOAP服务,发现在方法中出现问题时,两个方法中的处理代码以相同的速率完成,但是返回到REST客户端所需的响应比SOAP花费的时间更长。客户。 序列化对象时,REST的WCF API是否可能比SOAP的WCF API慢?

以下是fiddler的统计数据示例:

对于SOAP:请求计数:发送的1个字节:13,693(headers:299;正文:13,394)接收的字节:2,651,288(headers:235;正文:2,651,053)ClientConnected:16:12: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 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 application / soap + xml:2,651,053 〜标题〜:235

对于REST:请求计数:发送的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: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 application / xml:1,982,505〜headers 〜:230

两种服务之间的最大区别在于ServerBeginResponse与GotResponseHeaders。 我已经重复了几次测试,并且得到了相似的发现。

任何人都遇到相同的发现吗?

它可能取决于用于实现REST服务的框架。 我最近研究了基于JAXWS RI(Metro)的应用程序,后来将其移植到JAX RS(Jersey)框架中。 对于基于Rest的实现,每个服务调用可以获得更好的响应时间

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM