2011-05-27 57 views
4

我有一些使用WCF 3.5 + RESTful入门工具包开发的WCF RESTful服务。我遇到了许多同样的抱怨,它不是非常高效,并且不能很好地处理一连串的请求。我认为这个原因的一部分是3.5中的RESTful特性更像是一个社区插件。WCF 3.5 vs 4.0 RESTful Services性能

既然WCF 4.0 RESTful服务已经出现一段时间了,我推测有些人已经开发出来并在生产环境中使用它。

我在使用WCF REST服务模板40(CS),看到任何人有任何性能/可伸缩性问题。我还在检查WCF 3.5和WCF 4.0的RESTful服务之间是否进行了性能/可伸缩性比较。做一个快速的谷歌搜索没有产生很多结果。

任何反馈将不胜感激。

编辑

每请求,这是我的配置:

<bindings> 
    <webHttpBinding> 
    <binding name="TransportWeb"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"/> 
     </security> 
    </binding> 
    </webHttpBinding> 
</bindings> 

<services> 
    <service behaviorConfiguration="SecureBehavior" name="Service"> 
    <endpoint address="" binding="webHttpBinding" bindingConfiguration="TransportWeb" behaviorConfiguration="REST" contract="IServce"/> 
    <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange"/> 
    </service> 
</services> 

<behaviors> 
    <serviceBehaviors> 
    <behavior name="SecureBehavior"> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/> 
     <serviceDebug includeExceptionDetailInFaults="true"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="REST"> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
+0

其中一些“社区”功能是WCF 4中的那些新功能。 – 2011-05-27 21:01:53

回答

4

之前我们怪你建立在框架技术,告诉我们更多关于您的具体实现。我个人发现WCF本身的各个方面都可以在适当杠杆化的情况下进行扩展。通常情况下,你会发现这是一个人应该责怪的具体实现/配置。

因此,这里是你实现一些问题,希望能帮助社区帮助您更好地:

  • 你派出什么样的要求?
  • 您使用的入门工具包有哪些功能?
  • 你的绑定配置如何?
  • 你正在流入或流出任何二进制数据?
  • 您使用任何安全措施吗? (SSL,用户/密码等)
  • 您是否在执行任何长时间运行的任务?

更新1

所以,一切看起来不错,从绑定的角度和你解释什么,它听起来就像你有一个漂亮的“香草” WCF服务在这里。这听起来并不像你在描述中使用the WCF 3.5 REST Starter Kit framework中的任何一个,所以我不确定你是否遗漏了一些细节,或者你是否错误地说你使用它。

有一件事我注意到你没有在你的服务配置中做任何明确的<serviceThrottling>值。默认情况下,在.NET 3.5中,最大并发呼叫数仅为。因此,根据您的通话时间和您客户在任何给定时间的饱和度,您可能会被拒之门外。如果你check out this MSDN section titled Optimizing WCF Web Service Performance你会看到一些指导,建议实际配置maxConcurrentCalls为每个核心16。这是.NET 4的一个不同之处,因为如果您没有指定自己的显式值,它们会自动为您自动执行16 *个内核。自然地,为您的应用程序找到最佳位置的唯一方法是通过负载测试和数字播放。

说了这么多,我从你提供的信息中看到的错误并不多。如果您告诉我们更多有关您的Web服务内部的信息,或许我们可以就如何实现更好的性能提出更好的建议。对于我们现在所知的所有问题,您的瓶颈可能在您与之交互的某个数据库中。

因此,要回答这个问题的标题:在这一点上,我不认为有任何东西阻止你,因为你使用3.5。在4.0中肯定会有一些性能改进,但是在这里或者其他任何方面你都没有谈论超大规模,就像我说的那样,根据你的描述,你并不是真的在做任何复杂的WCF定制或者任何其他的东西。

+0

我添加了我的绑定。我正在使用一个漂亮的HTTPS POST调用。我没有进行任何流式传输。对于任何请求,我没有任何长时间运行的任务。主要是获取单个记录或保存单个记录。我没有使用任何自定义注释。只是我的类的基本WebInvoke,OperationContract,ServiceContract和DataContract属性。我拥有的大部分是非常基本的。就请求数量而言,我们每分钟对API进行大约100-200次请求。 – Brandon 2011-05-27 21:44:13

+0

根据您的更新更新了我的答案。 – 2011-05-28 03:16:43

+1

我能够通过做3件事来大幅提高性能。 1.切换到WCF 4.0,我能够利用Global.asax中的Application_start事件。 2.使用服务调节。 3.使用Mikael答案中的代码示例来实现CLR .NET Worker线程池。 – Brandon 2011-06-01 03:19:08