1

我遵循:这篇文章并在 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 吗?为什么初始化行为不同?

谢谢

4

1 回答 1

0

尝试在 EndpointBehavior 中添加 InstanceContextProvider 以及 InstanceProvider。如果没有无参数构造函数,ChannelDispatcher.ListenerLoopManager.Setup的Mono 实现似乎不喜欢没有 InstanceContextProvider 的想法。

InstanceContextProvider 本质上可以是一个无操作实现。只要有一个实例,它就会通过 ListenerLoopManagerSetup 中的检查并愉快地继续使用您的 InstanceProvider。

回复:为什么不同的实现...... Mono 是重新实现而不是交叉编译甚至移植。考虑他们的贡献指南的重要规则部分。直到最近,如果开发人员只要查看 MS 源代码,他们就可以为该项目做出贡献。

于 2015-05-30T19:01:27.457 回答