1

あらかじめ定義された WSDL (私はこれらを制御しません) をいくつか取得し、それらをデバイスに公開して、さまざまな SOAP/UPnP 要求に応答する必要があります。

とにかく、私はこれですべて機能していますが、任意の数のチャネルで要求できるサービスが 1 つあるため、問題が発生します。説明します:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:1", ConfigurationName="myInterface")]
public interface myInterface
{
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:1#GetConfiguration", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")]
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request);
}

基本的に、私がやろうとしていることは(この構文が完全に間違っていることは認識していますが、要点を理解できると思います)これです:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:{channelNumber}", ConfigurationName="myInterface")]
public interface myInterface
{
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:{channelNumber}#GetConfiguration", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")]
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request, String channelNumber);
}

元の Action メッセージの一部を、実装しているメソッドにパラメーターとして渡してほしいだけです。

これを実装できると私が考えた他の唯一の方法は、他のメソッドを指定することです。Action="*" を使用して Dispatcher と呼び、OperationContext.Current.IncomingMessageHeaders.Action. これは、物事を行うための本当に怪しげな方法のように思えます。ここでの主な障害は、私の WCF の経験不足にあると確信しています。

あなたが提供できるどんな助けも大歓迎です。

ありがとう、

4

2 に答える 2

1

アクションメソッドの唯一の一般化はワイルドカード * であり、通常は入力と出力の両方で generic として使用されますMessage

操作の選択とパラメーターの定義と入力の全体的な動作をカスタマイズする方法があります。次のインターフェイスを確認できます。

  • IDispatchOperationSelector受信データに基づいて操作を選択するために使用されます
  • IOperationInvokerパラメータを割り当て、によって選択された操作を呼び出すために使用されますIDispatchOperationSelector
  • IDispatchMessageFormatterによって準備された割り当てスロットに操作のパラメーターを入力するために使用されますIOperationInvoker

おそらくすべてを実装する必要はありませんが、必要な方法で動作をカスタマイズできます。カスタム セレクターとフォーマッター チェックの例については、この記事のカスタム インボーカー チェックの例についてMSDN サンプルを確認してください。とにかく、このインフラストラクチャ全体のコーディングは、アクションの解析をいくつかの WCF 内部に移動するだけですが、それを操作パラメーターとして取得するには、それを行う必要があります。

于 2011-04-21T21:40:12.423 に答える
1

これを管理する最も簡単な方法は、汎用メッセージ ハンドラーを作成することです。契約は次のようになります。

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ICatchAll
{
    [OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")]
    Message ProcessMessage(Message message);
}

アイデアは、この記事の内容に沿ってサービスの「ルーター」メソッドを作成することです。個別のチャネル サービス コントラクトを作成して、SOAP メッセージを受信して​​返すようにする必要がありますが、クライアント エンドポイントを「ルーター」サービス エンドポイントに移動させる必要があります。各チャネル サービス コントラクトの個別のインスタンスを作成すると、新しい WCF 4 RoutingService を使用してこれらの線に沿って何かを実行できる場合があります。

于 2011-04-21T21:16:51.730 に答える