【问题标题】:WCF Extensibility – IInstanceProvider in monoWCF 可扩展性 – 单声道中的 IInstanceProvider
【发布时间】: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 吗?为什么初始化行为不同?

谢谢

【问题讨论】:

    标签: wcf mono


    【解决方案1】:

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

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

    Re:为什么不同的实现... Mono 是重新实现,而不是交叉编译甚至移植。考虑Important Rules section of their Contribution Guidelines。直到最近,如果开发人员只要查看 MS 源代码,他们就可以为该项目做出贡献。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      相关资源
      最近更新 更多