正如我从这篇文章中了解到的:
Single:这将有助于我们在全球范围内共享数据。我们只能创建一个实例,并且相同的实例将在后续调用中被重用。与 Per Session 相同,这将适用于除 basicHttpBinding 之外的所有绑定。
InstanceContextMode.Single 不适用于 basicHttpBinding。
但根据这个答案,它有效。
这篇文章增加了混乱。
我想得到明确的答案和解释。
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 测试客户端,结果如下:
我不确定为什么有些文章指出basicHttpBinding 不支持InstanceContextMode.Single。这显然不是真的。
我一直将 InstanceContextMode.Single 与 ConcurrencyMode.Multiple 结合用于高吞吐量服务。
它还有一个优点是您可以在服务的生命周期内保持一些“状态”,这些“状态”可以在所有请求之间共享。例如,我将常用数据保存在私有字段中,以避免在每次请求时从数据库中加载它等。