2014-01-30 5 views
10

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

Вот что я хочу:

У меня есть проект .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).

Благодаря

ответ

3

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

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

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

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

Смежные вопросы