Как перенаправить HttpRequestMessage на другой сервер - программирование
Подтвердить что ты не робот

Как перенаправить HttpRequestMessage на другой сервер

Какой лучший способ перенаправить HTTP-api-запрос на другой сервер?

Вот что я пытаюсь:

У меня есть проект .NET, где, когда я получаю определенные запросы API, я хочу изменить запрос, перенаправить его на другой сервер и вернуть ответ, отправленный этим вторым сервером.

Я делаю следующее:

[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 я получаю ответ 404, где для параметра RequestMessage.RequestUri установлено значение http://localhost:61833/api/products/2. (http://localhost:61833 является корнем исходного запроса uri).

Спасибо

4b9b3361

Ответ 1

Вам может потребоваться явно указать заголовок хоста на экземпляре клонирования. В противном случае вы просто копируете исходное значение заголовка запроса запроса в клон.

то есть. добавьте следующую строку в конец вашего метода Clone: ​​

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

Кроме того, в зависимости от того, чего вы пытаетесь достичь здесь, вам также может потребоваться обработать другие проблемы, такие как домены cookie, по запросу, не соответствующему новому домену, на который вы пересылаете, а также установление правильного домена для любых файлов cookie ответов, которые возвращаются.