我使用NetTcp绑定(在Windows Server 2012 Datacenter上的IIS 8上托管)的WCF服务有一个不明确的CPU问题 我在一个服务中持有WCF客户端(代理)池并使用它来连接另一个服务。 我们的问题是,当持有池的客户端服务没有正确处理时(这可能是我们的情况),那么服务器正在旋转到100%的CPU并保持一段时间(持续时间很大程度上取决于数量)池中的客户尚未关闭) 我们在服务器上使用InstanceContextMode.Single和多个并发模式,没有可靠的会话..
服务器配置:
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IRecommenderService" closeTimeout="00:00:01.5000000" openTimeout="00:00:01.5000000" receiveTimeout="00:00:01.5000000" sendTimeout="00:00:01.5000000" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="2147483647" maxReceivedMessageSize="2147483647" listenBacklog="2147483647" transactionFlow="false">
<readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
<reliableSession enabled="false"/>
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceThrottling maxConcurrentCalls="4000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" />
</behavior>
<behavior name="Unthrottled">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceThrottling maxConcurrentCalls="6000" maxConcurrentSessions="6000" maxConcurrentInstances="6000" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="UnthrottledServiceEndpoint">
<dispatcherSynchronization maxPendingReceives="10000" asynchronousSendEnabled="true" />
</behavior>
</endpointBehaviors>
</behaviors>
客户端配置:
<client>
<endpoint address="net.tcp://this-will-be-given-at-runtime:12345/an-invalid-service-too/"
behaviorConfiguration="UnthrottledClientEndpoint" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IRecommenderService" contract="RecommenderClient.IRecommenderService"
name="IRecommenderServiceClient_nettcp" />
</client>
...
<behavior name="UnthrottledClientEndpoint">
<dispatcherSynchronization asynchronousSendEnabled="true" />
<dataContractSerializer maxItemsInObjectGraph="2147483647" />
</behavior>
...
任何答案都将不胜感激 谢谢, 鹭。
答案 0 :(得分:1)
//当没有正确处理持有池的客户端服务时(这可能是我们的场景)//
您是说您为WCF连接编写了自己的“池”吗?
我不会这样做。我会在每次使用后使用代理并处理它......以避免你所描述的确切内容。
如果你不能“信任”你的dotnet消费者关闭/处理的东西,那么我会建议(像我一样)编写一个ClientWrapper程序集,他们必须通过它......你确保你关闭它代理。
我把它比作IDataReader。如果我将IDataReaders返回给客户端,我不能保证消费者处理它们。阿卡,它超出了我的控制范围。没门。我使用IDataReader,处理它,然后给它们一些(序列化的?)对象。消费者永远不会得到一些他们可能忘记处理的东西,并把我搞砸了。
下面是我典型的“客户端”包装代码。
private IMyService GetTheProxy()
{
string endPointName = "MyEndPointName";
ChannelFactory<IMyService> factory;
//Use default endpoint
Console.WriteLine("endPointName='{0}'", endPointName);
factory = new ChannelFactory<IMyService>(endPointName);
IMyService proxy1 = factory.CreateChannel();
return proxy1;
}
public string GetAString()
{
string returnValue = null;
IMyService proxy1 = this.GetTheProxy();
using (proxy1 as IDisposable)
{
returnValue = proxy1.GetAString();
return returnValue ;
}
}
public int GetAnInt()
{
int returnValue = null;
IMyService proxy1 = this.GetTheProxy();
using (proxy1 as IDisposable)
{
returnValue = proxy1.GetAnInt();
return returnValue ;
}
}