1

私はフォローしました:この記事そして、それを WCF サービスに実装しました。IServiceBehaviorカスタムを実装し、その Service Behavior でサービスを装飾することにより、パラメーターなしのコンストラクターを持たない Service のインスタンスを作成できます。

[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の例外デフォルトコンストラクターが見つかりません

これは、mono が InstanceProviderBehaviorAttribute を無視している可能性があることを示しています。

私が気づいたもう1つのことは、次の行です。

Console.WriteLine("Using InstanceProviderBehaviorAttribute");

サービス ホストを開いたときに Windows で実行されます。サービスホストが開かれているときにLinuxにいる間、それはコンソールに書き込まれません。また、Linux の例外は、サービス ホストを開いたときにスローされませんが、IsInitiating操作が呼び出されたときにスローされMyServiceます。

[OperationContract(IsInitiating = true)]
void Initialize();

これは、IsInitiating 操作を呼び出したときにのみサービス インスタンスが解決されることを示しています。

なぜこれが Windows で動作し、Linux では mono で動作しないのか、何か考えはありますか? また、初期化の動作が異なるのはなぜですか?

ありがとう

4

1 に答える 1

0

InstanceContextProvider と InstanceProvider を EndpointBehavior に追加してみてください。ChannelDispatcher.ListenerLoopManager.SetupのMono 実装は、パラメーターなしのコンストラクターがない場合、InstanceContextProvider が存在しないという考えが気に入らないようです。

InstanceContextProvider は、基本的に何もしない実装にすることができます。インスタンスが存在する限り、ListenerLoopManagerSetup でそのチェックに合格し、喜んで InstanceProvider の利用に進みます。

Re: なぜ異なる実装なのか... Mono は、クロスコンパイルや移植ではなく、再実装です。Contribution Guidelines の Important Rules セクションを検討してください。ごく最近まで、開発者が MS のソース コードを見ただけでプロジェクトに貢献できるようになったのは初めてのことでした。

于 2015-05-30T19:01:27.457 に答える