我遵循:这篇文章并在 WCF 服务中实现了它。它允许我们创建一个没有无参数构造函数的 Service 实例,方法是实现一个 custom IServiceBehavior
,然后用该 Service Behavior 装饰该服务,而不是例如:
[ServiceBehavior]
public class MyService : IMyService
我会
[InstanceProviderBehavior]
public class MyService : IMyService
然后我像这样实现 ApplyDispatchBehavior:
foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers) {
foreach (EndpointDispatcher ed in cd.Endpoints) {
if (!ed.IsSystemEndpoint) {
Console.WriteLine("Using InstanceProviderBehaviorAttribute");
ed.DispatchRuntime.InstanceProvider = new ServiceInstanceProvider(Configuration.Instance.Container);
}
}
}
并提供我刚刚做的服务实例:
public object GetInstance(InstanceContext instanceContext, Message message)
{
AlertQueryService result = Container.Resolve<AlertQueryService>();
return result;
}
我在 Windows 中运行它,它按预期工作。但是在带有单声道的linux中,它会抛出异常
未找到类型 MyService 的异常默认构造函数
这表明单声道可能忽略了 InstanceProviderBehaviorAttribute。
我注意到的另一件事是这条线:
Console.WriteLine("Using InstanceProviderBehaviorAttribute");
服务主机打开时在windows中执行。在 linux 中,当服务主机打开时,它不会在控制台中写入。同样,当我们打开服务主机时不会抛出linux中的异常,而是在IsInitiating
调用操作时MyService
:
[OperationContract(IsInitiating = true)]
void Initialize();
这表明使用单声道服务实例仅在我们调用 IsInitiating 操作时才被解析。
知道为什么这适用于 Windows 而不是单声道的 linux 吗?为什么初始化行为不同?
谢谢