1

CORS の問題がいくつか発生しました。サーバー プロキシを使用して回避しようとしています。しかし、私は POST リクエストで大きな問題に直面しています。

プロキシの一般的な構造は次のとおりです。 JQuery-based client -> WebServer HttpHandler Proxy -> WebAPI Service

クライアントは JSON ペイロードを使用し、それらが返されることを期待します。

クライアントの例:

ourcompany.datasource.postData({
    data: ko.toJSON(requestObject),
    success: function (response, status) { ourcompany.messenger.success('Thanks for the data!');},
    error: function () { ourcompany.messenger.fail('Oh no!'); }
}

これは、jquery の基礎となるオブジェクトの周りにいくつかのラッパーを追加するだけです。完全を期すために、リクエストの定義を次に示します。残りの jquery.ajax パラメータは次の場所にあります。

amplify.request.define('postData', 'ajax', {
    url: buildProxyUrl(outCompany.urls.svcData),
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    beforeSend: addCustomHeaders,
    decoder: wrapperDecoder
});

WebAPI の例:

[HttpPost]
public HttpResponseMessage PostData(PostDataRequest request)
{
      HttpResponseMessage response = null;
      var response = BusinessLayer.DoSomeStuff(request);
      return response;
}

これはすべて、非プロキシの状況では正常に機能します。ご覧のとおり、WebAPI 側で JSON を逆シリアル化することにより、複雑な .NET オブジェクトを作成します。

プロキシはこれをすべて台無しにしています。基本的に、元のリクエストの JSON コンテンツを 2 番目のリクエストに沿って送信する方法がわかりません。転送によって混乱することはありません。現在のコードは次のようになります。

private void MakeHttpPostRequest(HttpContext context)
{
    var url = context.Request["url"];
    var req = WebRequest.Create(url);
    req.Method = "POST";
    req.Headers["x-customheader"] = context.Request.Headers["x-customheader"];

    var reqStream = req.GetRequestStream();
    context.Request.InputStream.Position = 0;
    context.Request.InputStream.CopyTo(reqStream);
    reqStream.Close();
    context.Request.InputStream.Close();


    using (var stream = req.GetResponse().GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var content = reader.ReadToEnd();
            context.Response.ContentType = "application/json";
            context.Response.Write(content);
        }
    }
}

コンテンツを抽出して送信要求にプッシュする他のいくつかの方法を試しましたが、何も機能しないようです。最良の場合、WebAPI メソッドは要求オブジェクトの null 値で呼び出されます。この時点でどこに行けばいいのかわかりません。

4

1 に答える 1