【问题标题】:Unexplained performance difference between WCF rest vs SOAP webserviceWCF rest 与 SOAP webservice 之间无法解释的性能差异
【发布时间】:2013-05-12 00:31:36
【问题描述】:

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

 [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 Web 服务使用 ws-security,但 REST Web 服务没有实现任何安全性。 我发现 SOAP 网络服务返回响应比 REST 网络服务快得多。

我不确定我们的场景是否不太适合 REST 服务,或者我是否错误地实现了 REST Web 服务? 我也尝试过调试 REST 和 SOAP 服务,发现当它在方法中中断时,两种方法中的处理代码以相同的速率完成,但响应返回 REST 客户端所需的时间比 SOAP 长客户。序列化对象时,REST 的 WCF api 是否可能比 SOAP 的 WCF api 慢?

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

对于 SOAP: 请求数:1 发送的字节数:13,693(标头:299;正文:13,394) 接收字节数:2,651,288(标头:235;正文:2,651,053) 客户端连接:16:12:39.775 客户端开始请求:16:12:39.775 GotRequestHeaders:16:12:39.775 客户端完成请求:16:12:40.120 确定网关:0ms DNS 查询:0 毫秒 TCP/IP 连接:1 毫秒 HTTPS 握手:0 毫秒 服务器连接:16:12:40.122 提琴手开始请求:16:12:40.122 服务器请求:16:12:40.122 服务器开始响应:16:12:40.123 GotResponseHeaders:16:13:25.744 服务器完成响应:16:13:26.863 客户端开始响应:16:13:25.744 客户端完成响应:16:13:26.863 总耗时:00:00:47.0877083 应用程序/soap+xml:2,651,053 〜标题〜:235

对于 REST: 请求数:1 发送的字节数:2,369(标头:298;正文:2,071) 接收字节数:1,982,735(标头:230;正文:1,982,505) 客户端连接:16:12:07.728 客户端开始请求:16:12:32.427 GotRequestHeaders:16:12:32.427 客户端完成请求:16:12:32.428 确定网关:0ms DNS 查询:0 毫秒 TCP/IP 连接:2 毫秒 HTTPS 握手:0 毫秒 服务器连接:16:12:32.430 提琴手开始请求:16:12:32.430 服务器请求:16:12:32.431 服务器开始响应:16:12:32.435 GotResponseHeaders:16:20:06.914 服务器完成响应:16:20:07.889 客户端开始响应:16:20:06.914 客户端完成响应:16:20:07.889 总耗时: 00:07:35.4626091 应用程序/xml:1,982,505 〜标题〜:230

这两种服务的最大区别在于 ServerBeginResponse 到 GotResponseHeaders。 我已经多次重复这个测试并得到了类似的结果。

有人遇到同样的发现吗?

【问题讨论】:

标签: wcf web-services rest soap wcf-rest


【解决方案1】:

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

【讨论】:

  • 这也是我发现的。看起来 ASP.net web api 比 WCF 更适合 REST。
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2020-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多