2014-01-30 19 views
10

Was ist der beste Weg, eine http Web API-Anfrage an einen anderen Server weiterzuleiten?So leiten Sie eine HttpRequestMessage an einen anderen Server weiter

Hier ist, was ich versuche:

ich ein .NET-Projekt, wo, wenn ich bestimmte API-Anfragen erhalte ich die Anfrage ändern möchten, leitet es an einen anderen Server, und geben die Antwort von diesem zweiten Server gesendet .

Ich mache folgendes:

[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; 
} 

Wo die Clone-Methode wie folgt definiert ist:

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; 
} 

jedoch aus irgendeinem Grund statt der URL auf die angegebene redirectUri Umleitung ich ein 404 Antwort, bei der RequestMessage.RequestUri auf http://localhost:61833/api/products/2 festgelegt ist. (http://localhost:61833 ist die Wurzel der ursprünglichen Anfrage uri).

Dank

Antwort

3

Unter Umständen müssen Sie explizit die Host-Header auf der Klon-Instanz festgelegt. Andernfalls kopieren Sie einfach den Hostheaderwert der ursprünglichen Anforderung in den Klon.

dh fügen Sie die folgende Zeile am Ende des Clone-Methode:

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

auch, je nachdem, was Sie versuchen, hier zu erreichen, können Sie auch andere Themen wie Cookie-Domains auf die Anfrage behandeln müssen Sie stimmen nicht mit der neuen Domäne überein, an die Sie weiterleiten, sowie mit der Einstellung der richtigen Domäne für alle Antwort-Cookies, die zurückgegeben werden.

Verwandte Themen