2014-01-30 88 views
10

將http web api請求轉發給其他服務器的最佳方式是什麼?如何將HttpRequestMessage轉發給其他服務器

這裏就是我想:

我在那裏時,我得到一定的API請求,我想修改請求,將其轉發到另一臺服務器,並返回由第二服務器發送的響應.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; 
} 

凡克隆方法被定義爲:

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.Headers.Host = new Uri(newUri).Authority; 

此外,根據你正試圖在這裏實現什麼,你可能還需要處理該請求的其他問題,如餅乾域不匹配您要轉發的新域,以及在返回的任何響應cookie上設置正確的域。

相關問題