2

ここで尋ねた前の質問への解決策からフォローアップします。.NET4 Web サービスでカスタム バインディングを使用すると、Web サービス WebInvoke コントラクトを実装するメソッドが、リクエスト ボディ ストリームの引数を含む場合に呼び出されなくなるという問題があるようです。

したがって、上記のリンクから見つけた Web サービスを実行するコードは次のとおりです。

webserviceHost = new WebServiceHost(typeof(Service1), new Uri("http://localhost:8080));
webserviceHost.AddServiceEndpoint(typeof(IService), getBinding(), "webservice").Behaviors.Add(new WebHttpBehavior());
webserviceHost.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true });
webserviceHost.Open();

定義された WebInvoke サービス コントラクトは次のとおりです。

[WebInvoke(UriTemplate = "import_data?param={value}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
WebResult importOrder(string value, Stream httpRequestPostBody);

上記のコントラクトを実装するメソッドは次のとおりです。

public WebResult importOrder(String value, Stream httpRequestPostBody)
{
    doSomething(value, httpRequestPostBody);
}

したがって、Fiddler を介して Web サービス エンドポイント コントラクトに HTTP 要求を送信しようとすると、接続リセット HTTP エラー応答が返されます。Stream httpRequestPostBody 引数を削除すると、メソッドが実行されますが、リクエスト本文の生の JSON データにアクセスする方法がありません (本文は取得できますが、XML 形式です)。そのため、リクエストの本文ストリームを確実に渡すために、カスタム バインディングに何かが欠けていることだけを収集できます。手がかりを得た人はいますか?

4

1 に答える 1

0

したがって、私が思いついた唯一の答えは、コントラクトからストリームを削除し、.NET の DataContractJsonSerializer を使用して、HTTP 要求本文メッセージを XML から JSON に変換することです。以下に示すように

契約:

[WebInvoke(UriTemplate = "import_data?param={value}", Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
WebResult importOrder(string value);

実装:

public WebResult importOrder(String value){
    MyObject myObject = (MyObject)new DataContractJsonSerializer(typeof(MyObject)).ReadObject(OperationContext.Current.RequestContext.RequestMessage.GetReaderAtBodyContents());

    doSomething(value, myObject);
}

メッセージが RAW から JSON、XML、MyObject に変換されているため、このソリューションは理想的ではありません。また、より優れたサードパーティの JSON パーサーを簡単に使用して、受信データからオブジェクトを初期化する方法を制御することもできません。誰かがより良い解決策を持っているなら、私はすべて耳にします。

于 2012-10-17T02:45:51.007 に答える