WCF服务正在对每个呼叫进行实施

时间:2014-02-06 14:25:54

标签: c# .net wcf web-services

我在客户端有一个WCF服务,在服务器端有一个wcf服务。 每个服务都有这一行:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]

我使用的是basicHttpBinding而没有安全性。

我在客户端服务上有方法:

private static ChannelFactory<IDatabaseProvider> _channel;
private static IDatabaseProvider _proxy;
private static DataTransferClient _client;

private bool IsChannelStateNeedToInit()
{
        return _proxy == null || ((IClientChannel)_proxy).State == System.ServiceModel.CommunicationState.Faulted || ((IClientChannel)_proxy).State == System.ServiceModel.CommunicationState.Closed;
}
public bool ConnectService()
{
        try
        {
            if (_channel == null || _proxy == null || IsChannelStateNeedToInit())
            {
                _channel = new ChannelFactory<IDatabaseProvider>("DatabaseProviderEndpointClient");
                _proxy = _channel.CreateChannel();
                _proxy.ConnectService();
            }
            return _proxy.IsDataBaseConnected(); 
        }
        catch (Exception ex)
        {
            Logger.Instance.LogFatal(ex);
            return false; 

        }
}

我的客户端服务由Windows服务托管,我的服务器服务由IIS7托管。 在(服务器的)wcf服务的每个实例化中,我写入事件日志,我看到在每次调用时,即使IsChannelStateNeedToInit()返回false,我的WCF服务也在实例化。

在我的一个测试环境中,我甚至在服务器端遇到此异常。

Failed to InsertBulkToDatabase. EXCEPTION: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool.

我的网络配置文件:

<serviceBehaviors>
    <behavior name="DefaultServiceBehavior">
      <serviceThrottling maxConcurrentCalls="200" maxConcurrentSessions="200" maxConcurrentInstances="200"/>
    </behavior>
  </serviceBehaviors>

我的应用配置

<basicHttpBinding>
    <binding name="BasicHttpBindConfig" closeTimeout="00:10:00" openTimeout="00:10:00"
      receiveTimeout="00:10:00" sendTimeout="00:10:00" hostNameComparisonMode="StrongWildcard"
      maxBufferPoolSize="524288" maxBufferSize="6553600" maxReceivedMessageSize="6553600"
      transferMode="Buffered">
      <security mode="None">
      </security>
    </binding>
  </basicHttpBinding>

如何在每次通话时避免这种类型的实例化? 为什么我的服务不能仅在不同的客户端上实例化?

1 个答案:

答案 0 :(得分:4)

basicHttpBinding 不支持会话。这就是为什么每次调用都会获得一个新实例的原因。请参阅:http://msdn.microsoft.com/en-us/library/ms731092(v=vs.110).aspx

您可以通过使用[ServiceContract(SessionMode = SessionMode.Required)]注释您的服务合同来避免此麻烦 如果您尝试在端点中使用不支持会话的绑定

,则会引发异常