1

正如我从这篇文章中了解到的:

Single:这将有助于我们在全球范围内共享数据。我们只能创建一个实例,并且相同的实例将在后续调用中被重用。与 Per Session 相同,这将适用于除 basicHttpBinding 之外的所有绑定。

InstanceContextMode.Single 不适用于 basicHttpBinding。

但根据这个答案,它有效。

这篇文章增加了混乱。

我想得到明确的答案和解释。

4

1 回答 1

2

InstanceContextMode.Single 将强制 WCF 引擎在服务的整个生命周期内创建服务类的单个实例。这意味着所有请求将共享同一个实例,而不是为每个请求创建一个实例。

这完全可以通过 basicHttpBinding 实现。

下面是一个使用 basicHttpBinding 和 InstanceContextMode.Single 的示例:

首先是我的服务类,它具有保持请求计数的私有字段:

using System.ServiceModel;

namespace WcfService1
{
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    public class Service1 : IService1
    {
        private int _singleCounter = 0;//this will be preserved across requests
        public Service1() 
        {
            //this constructor executes only ONCE
        }
        public string GetData()
        {
            //this will increment with each request 
            //because it is a SINGLE instance the count
            //will be preserved
            _singleCounter++;
            return string.Format("Requests on this instance: {0}", _singleCounter);
        }
    }
}

现在我的服务合同:

using System.ServiceModel;

namespace WcfService1
{    
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        string GetData();
    }
}

最后这里是我的配置文件,使用 basicHttpBinding 进行单个绑定:

<?xml version="1.0"?>
<configuration>
  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <directoryBrowse enabled="true"/>
  </system.webServer>
</configuration>

现在使用 Visual Studio 附带的默认 WCF 测试客户端,结果如下:

首先调用计数为1: 在此处输入图像描述

第二次调用计数为 2: 在此处输入图像描述

单击几下后,计数仍被保留: 在此处输入图像描述

我不确定为什么有些文章指出basicHttpBinding 不支持InstanceContextMode.Single。这显然不是真的。

我一直将 InstanceContextMode.Single 与 ConcurrencyMode.Multiple 结合用于高吞吐量服务。

它还有一个优点是您可以在服务的生命周期内保持一些“状态”,这些“状态”可以在所有请求之间共享。例如,我将常用数据保存在私有字段中,以避免在每次请求时从数据库中加载它等。

于 2020-03-20T00:59:58.977 回答