15

http Web APIリクエストを別のサーバーに転送する最良の方法は何ですか?

これが私が試していることです:

特定の API 要求を取得したときに、要求を変更し、それを別のサーバーに転送して、その 2 番目のサーバーから送信された応答を返したい .NET プロジェクトがあります。

私は次のことをしています:

[Route("forward/{*api}")]
public HttpResponseMessage GetRequest(HttpRequestMessage request)
{
    string redirectUri = "http://productsapi.azurewebsites.net/api/products/2";
    HttpRequestMessage forwardRequest = request.Clone(redirectUri);

    HttpClient client = new HttpClient();
    Task<HttpResponseMessage> response = client.SendAsync(forwardRequest);
    Task.WaitAll(new Task[] { response } );
    HttpResponseMessage result = response.Result;

    return result;
}

Clone メソッドは次のように定義されています。

public static HttpRequestMessage Clone(this HttpRequestMessage req, string newUri)
{
    HttpRequestMessage clone = new HttpRequestMessage(req.Method, newUri);

    if (req.Method != HttpMethod.Get)
    {
        clone.Content = req.Content;
    }
    clone.Version = req.Version;

    foreach (KeyValuePair<string, object> prop in req.Properties)
    {
        clone.Properties.Add(prop);
    }

    foreach (KeyValuePair<string, IEnumerable<string>> header in req.Headers)
    {
        clone.Headers.TryAddWithoutValidation(header.Key, header.Value);
    }

    return clone;
}

ただし、何らかの理由で、URL を指定された redirectUri にリダイレクトする代わりに、RequestMessage.RequestUri が に設定されている 404 応答が返されhttp://localhost:61833/api/products/2ます。(http://localhost:61833元のリクエスト uri のルートです)。

ありがとう

4

1 に答える 1

9

クローン インスタンスにホスト ヘッダーを明示的に設定する必要がある場合があります。それ以外の場合は、元のリクエストのホスト ヘッダー値をクローンにコピーするだけです。

つまり、Clone メソッドの末尾に次の行を追加します。

clone.Headers.Host = new Uri(newUri).Authority;

また、ここで達成しようとしていることに応じて、リクエストの Cookie ドメインが転送先の新しいドメインと一致しないなどの他の問題を処理する必要がある場合や、返された応答 Cookie に正しいドメインを設定する必要がある場合もあります。

于 2015-02-11T14:19:05.397 に答える