2012-05-17 3 views
31

Betrachten Sie einen API-Service ASP.NET Web, dieWie konfiguriert man HttpClient nicht automatisch umleiten, wenn er einen 301 HTTP Status Code empfängt?

public class ThisController : ApiController 
{ 
    /* more methods */ 

    public override HttpResponseMessage Post() 
    { 
     var result = new HttpResponseMessage(HttpStatusCode.MovedPermanently); 
     // Post requests should be made to "ThatController" instead. 
     string uri = Url.Route("That", null); 
     result.Headers.Location = new Uri(uri, UriKind.Relative); 
     return result; 
    } 
} 

umleitet, die erwiesenermaßen POST'ing Daten zu überprüfen, um „api/dieses“ leitet Sie auf den „api/dass“ ich die folgenden Testverfahren habe:

[TestMethod] 
public void PostRedirects() 
{ 
    using (var client = CreateHttpClient("application/json")) 
    { 
     var content = CreateContent(expected, "application/json"); 
     using (var responseMessage = client.PostAsync("api/this", content).Result) 
     { 
      Assert.AreEqual(HttpStatusCode.MovedPermanently, responseMessage.StatusCode); 
      Assert.AreEqual(new Uri("https://api.example.com/api/that"), responseMessage.Headers.Location); 
     } 
    } 
} 

protected HttpClient CreateHttpClient(string mediaType) 
{ 
    var client = new HttpClient(); 
    client.BaseAddress = new Uri("http://api.example.com/"); 
    MediaTypeWithQualityHeaderValue headerValue = MediaTypeWithQualityHeaderValue.Parse(mediaType); 
    client.DefaultRequestHeaders.Accept.Add(headerValue); 
    client.DefaultRequestHeaders.AcceptEncoding.Add(StringWithQualityHeaderValue.Parse("gzip")); 
    client.DefaultRequestHeaders.AcceptEncoding.Add(StringWithQualityHeaderValue.Parse("deflate")); 
    client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue(new ProductHeaderValue("MyProduct", "1.0"))); 
    client.MaxResponseContentBufferSize = 1024*1024*8; 
    return client; 
} 

protected ObjectContent CreateContent(T model, string mediaType) 
{ 
    var requestMessage = new HttpRequestMessage(); 
    MediaTypeFormatter mediaTypeFormatter = null; 
    switch (mediaType) 
    { 
     case "application/json": 
      mediaTypeFormatter = new JsonMediaTypeFormatter(); 
      break; 

     case "application/xml": 
     case "text/xml": 
      mediaTypeFormatter = new XmlMediaTypeFormatter(); 
      break; 

     default: 
      Assert.Fail(); 
      break; 
    } 

    return requestMessage.CreateContent(
     model, 
     new[] { mediaTypeFormatter }, 
     new FormatterSelector()); 
} 

Was wirklich passiert ist, dass ein HTTP-Statuscode an den Client mit dem Header richtigen Ort gesendet wird und dass Httpclient führt dann automatisch eine GET auf diesem URI. Als Ergebnis ist mein Test nie bestanden.

Wie konfiguriere ich den HttpClient nicht automatisch umleiten, wenn er eine 301 empfängt, so dass ich die Antwort meines Servers überprüfen kann?

+0

Mögliche Duplikat [? Wie kann ich System.Net.Http.HttpClient bekommen nicht 302 Umleitungen folgen] (http://stackoverflow.com/questions/10453892/how-can -i-get-system-net-http-httpclient-zu-nicht-folgen-302-Weiterleitungen –

Antwort

67

Versuchen:

var handler = new HttpClientHandler() 
{ 
    AllowAutoRedirect = false 
}; 

HttpClient client = new HttpClient(handler); 
Verwandte Themen