【发布时间】:2013-01-24 11:51:30
【问题描述】:
我关注了:this article 并在 WCF 服务中实现了它。
它允许我们通过实现自定义IServiceBehavior 来创建没有无参数构造函数的服务实例,然后用该服务行为装饰服务,而不是例如:
[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 中运行它,它按预期工作。但是在带有mono的linux中,它会抛出异常
异常 MyService 类型未找到默认构造函数
这表明mono可能忽略了InstanceProviderBehaviorAttribute。
我注意到的另一件事是:
Console.WriteLine("Using InstanceProviderBehaviorAttribute");
在服务主机打开时在windows中执行。在 linux 中,当服务主机打开时,它不会在控制台中写入。同样linux中的异常也不是在我们打开服务主机时抛出的,而是在MyService中调用IsInitiating操作时:
[OperationContract(IsInitiating = true)]
void Initialize();
这表明单声道服务实例仅在我们调用 IsInitiating 操作时才被解析。
知道为什么这适用于 windows 而不是单声道的 linux 吗?为什么初始化行为不同?
谢谢
【问题讨论】: