2

HTTP GET 要求用に現在セットアップされている WCF 4.0 サービスがあります。POST を使用するように変更しようとしていますが、既存の GET URI との下位互換性を維持します。Web サービスは、jQuery および JSON データを使用して呼び出されています。したがって、私の要件は次のとおりです。

  • おそらく WebInvoke 属性の UriTemplate パラメーターを使用して、既存の GET URI と一致させます。
  • おそらく WebMessageBodyStyle.Wrapped と WebMessageFormat.Json を WebInvoke 属性とともに使用して、POST 本文の JSON データから既存のパラメーターを取得します。
  • できれば、データの大きなブロブを POST 本文から引き出す方法があり、おそらく JSON オブジェクトにもラップされています。

よし、それはさておき、これが私がこれまでに得たものです。私の小さなテスト サービスは AjaxService と呼ばれ、ToUpper と呼ばれるメソッドが 1 つあります。まず、私の web.config:

<configuration>
    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>

    <system.serviceModel>
        <behaviors>
            <endpointBehaviors>
                <behavior name="WebApplication2.AjaxServiceAspNetAjaxBehavior">
                    <!--<enableWebScript />-->
                    <webHttp helpEnabled="true" />
                </behavior>
            </endpointBehaviors>
        </behaviors>

        <protocolMapping>
            <remove scheme="http" />
            <add scheme="http" binding="webHttpBinding" />
        </protocolMapping>

        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

        <services>
            <service name="WebApplication2.AjaxService">
                <endpoint address=""
                    behaviorConfiguration="WebApplication2.AjaxServiceAspNetAjaxBehavior"
                    binding="webHttpBinding"
                    contract="WebApplication2.AjaxService" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

次のバージョンの ToUpper 関数を使用すると、HTTP GET のように URI で引数を渡すことができます。

  [OperationContract]
  [WebInvoke( UriTemplate="ToUpper?str={str}",
              Method = "POST",
              BodyStyle = WebMessageBodyStyle.WrappedRequest,
              RequestFormat=WebMessageFormat.Json,
              ResponseFormat=WebMessageFormat.Json)]
  public string ToUpper(string str)
  {
      return str.ToUpper();
  }

次のようにJavascriptで使用され、「THIS IS FROM THE URI」を正しく返します。

$(document).ready(function () {
    $.ajax({
        type: "POST",
        url: "AjaxService.svc/ToUpper?str=this%20is%20from%20the%20uri",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            console.log("result: " + JSON.stringify(data));
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log("error", jqXHR, textStatus, errorThrown);
        }
    });
});

UriTemplate="ToUpper?str={str}"WebInvoke パラメーターから削除し、代わりにこの JavaScript を使用することで、URI の代わりに POST データにパラメーターを配置できます。「THIS IS FROM THE POST」を正しく返します。

$(document).ready(function () {
    $.ajax({
        type: "POST",
        url: "AjaxService.svc/ToUpper",
        data: JSON.stringify({str:"This is from the POST"}),
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        success: function (data) {
            console.log("result: " + JSON.stringify(data));
        },
        error: function (jqXHR, textStatus, errorThrown) {
            console.log("error", jqXHR, textStatus, errorThrown);
        }
    });
});

そのままにUriTemplate="ToUpper?str={str}"して上記の JavaScript を使用すると、URI の代わりに POST データから str パラメータを引き出すのに十分スマートになることを期待していました。残念ながら、エラー 400 が表示されるだけです。それを機能させる方法はありますか?

私が試したもう 1 つのことは、オプションの Stream パラメーターを使用して、POST データの生の内容を取得することです。ただし、このブログ投稿で指摘されているように、コンテンツ タイプを JSON ではなくプレーン テキストに設定した場合にのみ、そのストリームを取得できます。それを実行してストリームを手動で解析することもできますが、URL を手動で調べて、実際の値またはデフォルトを取得したかどうかを判断する必要があると思います。うん。

システムのバインディング/設定でこれを機能させる方法がない場合は、POST と URI からパラメーターを引き出すのがスマートなカスタム バインディングを作成しようと考えていました。 JSONを使用しています。私はそれを行う方法を理解しようとして数時間を費やしましたが、困惑しています!

他の誰かがこれに取り組んだか、それを機能させる方法について何かアイデアを持っていますか? 私がこれを試みた最初の人だとは想像できませんが、多くの検索を行った後、手ぶらで出てきました。

4

0 に答える 0