所有
我有一个间歇性超时的WCF服务,通常是在来自asp.net客户端的大约十或十二个请求之后。该服务使用反射在其程序集(WAP dll)中查找具有自定义属性集的类。这个过程本身非常快,通常只需要几毫秒,当它工作时,它的工作效果很好。
在调用代码和服务本身中设置断点告诉我,在来自WCF客户端代理类的调用与实际执行该方法之间发生了超时。
想法?
更新:来自web.config的绑定等:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Sdd.Services.ControlPanelBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="Sdd.Services.ControlPanelBehavior"
name="Sdd.Services.ControlPanel">
<endpoint address="" binding="wsHttpBinding" contract="Sdd.Services.IControlPanel">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
更新:这是客户端web.config中的相关部分:
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IControlPanel" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:81/services/ControlPanel.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IControlPanel"
contract="PublicSite.IControlPanel" name="WSHttpBinding_IControlPanel">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
答案 0 :(得分:4)
糟糕!
这可能是最愚蠢的错误,但我想出了问题:因为我习惯使用Web引用(.asmx web服务)而不是服务引用(WCF),我忽略了关闭代理对象。改变了
[WebMethod]
public static List<Page>PagesGetAll()
{
ControlPanelClient cp = new ControlPanelClient();
Page[] pageArray = cp.NavigationPagesGetAll();
List<Page> pageList = pageArray.ToList<Page>();
// make sure that the page list in the database is up-to-date.
foreach(Page page in pageList)
Navigation.PageUpdate(page);
return pageList;
}
到
public static List<Page>PagesGetAll()
{
List<Page> pageList = null;
using (ControlPanelClient cp = new ControlPanelClient())
{
Page[] pageArray = cp.NavigationPagesGetAll();
pageList = pageArray.ToList<Page>();
// implied cp.Close() from "using" statement
}
// make sure that the page list in the database is up-to-date.
foreach(Page page in pageList)
Navigation.PageUpdate(page);
return pageList;
}
问题消失了。在验证此解决方案之后,我还增加了并发请求的数量,因为有超过10-12个并发请求会产生我之前看到的相同问题似乎是合乎逻辑的。
谢谢大家!
答案 1 :(得分:2)
帮助诊断此类问题的一种好方法是在client and the server上启用跟踪并使用Service Trace View Tool。这将使您更好地了解问题的确切位置(以何种方式或调用方式)。
答案 2 :(得分:0)
不幸的是,配置中最重要的部分(绑定和服务端点)丢失了 - 客户端配置也是如此。
但是你描述它的方式,10-12个请求似乎工作正常,然后出现故障,可能指向服务器上的并发/限制问题。
我会尝试增加并发调用和会话的数量,看看是否有帮助。为此,您需要在服务器上的行为配置中添加serviceThrottling
部分:
<behavior name="Sdd.Services.ControlPanelBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceThrottling
maxConcurrentCalls="25" // default is 16
maxConcurrentSessions="25" // default is 10
maxConcurrentInstances="25" /> // no default
</behavior>
如果这有帮助 - 您遇到了太多会话或打开并发呼叫的问题。 wsHttpBinding协议默认使用会话,所以你可能只需要告诉它使用每次调用。
马克