在WCF自托管服务中指定单例服务
我正在编写一个通过WCF公开服务的应用程序。该服务是自托管的(控制台应用程序),需要使用单实例。我试图弄清楚如何在服务配置中指定singleton,而不在服务实现中使用属性。是否可以在没有属性的代码中指定singleton 谢谢, Erick您可以将服务实例传递给在WCF自托管服务中指定单例服务,wcf,self-hosting,Wcf,Self Hosting,我正在编写一个通过WCF公开服务的应用程序。该服务是自托管的(控制台应用程序),需要使用单实例。我试图弄清楚如何在服务配置中指定singleton,而不在服务实现中使用属性。是否可以在没有属性的代码中指定singleton 谢谢, Erick您可以将服务实例传递给ServiceHost,而不是传递类型。在这种情况下,您传递的实例将作为单例使用 编辑: 我以前的解决方案不起作用。向ServiceHost构造函数提供实例仍然需要ServiceBehaviorAttribute使用InstanceCo
ServiceHost
,而不是传递类型。在这种情况下,您传递的实例将作为单例使用
编辑:
我以前的解决方案不起作用。向ServiceHost
构造函数提供实例仍然需要ServiceBehaviorAttribute
使用InstanceContextMode.Single
。但这一条应该有效:
var host = new ServiceHost(typeof(Service));
var behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
behavior.InstanceContextMode = InstanceContextMode.Single;
host.Open();
var-host=新服务主机(类型(服务));
var behavior=host.Description.Behaviors.Find();
behavior.InstanceContextMode=InstanceContextMode.Single;
host.Open();
ServiceBehaviorAttribute
即使您没有指定它,也会包含在内,因此您只需要获取它并更改默认值。如果您想将其移动到web.config
或app.config
,您可以使用自定义的BehaviorExtensionElement
和IServiceBehavior
:
public class InstanceContextExtensionElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get
{
return typeof(InstanceContextServiceBehavior);
}
}
protected override object CreateBehavior()
{
return new InstanceContextServiceBehavior(ContextMode);
}
const object contextMode = null;
[ConfigurationProperty(nameof(contextMode))]
public string ContextMode
{
get
{
return (string)base[nameof(contextMode)];
}
set
{
base[nameof(contextMode)] = value;
}
}
}
IServiceBehavior
实际上会将配置中的值解析到枚举中并进行设置(在@Ladislav的回答之后):
然后,您可以在配置中注册并使用它:
<extensions>
<behaviorExtensions>
<add name="instanceContext" type="FULLY QUALFIED NAME TO CLASS"/>
</behaviorExtensions>
</extensions>
...
<serviceBehaviors>
<behavior name="Default">
<instanceContext contextMode="Single"/>
...
我是WCF新手,我有一个WCF服务,我想通过配置而不是类上的元数据来控制它。请提供解决方案的详细信息。我需要将InstanceContextMode
强制为PerCall
,此方法也适用于此。
<extensions>
<behaviorExtensions>
<add name="instanceContext" type="FULLY QUALFIED NAME TO CLASS"/>
</behaviorExtensions>
</extensions>
...
<serviceBehaviors>
<behavior name="Default">
<instanceContext contextMode="Single"/>