2012-05-17 9 views
31

HttpClient, 301 HTTP Durum Kodu aldığında otomatik olarak yeniden yönlendirilmeyecek şekilde nasıl yapılandırılır?

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

"api/bu" yönlendirir o POST'ing verilerini doğrulamak için çalışılıyor yönlendiren bir ASP.NET Web API hizmetini düşünün size "API/o" ben aşağıdaki test yöntemi vardır: gerçekten bu ne olur

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

bir HTTP durum kodu doğru Location başlığı ile müşteriye gönderildiğini ve HttpClient sonra otomatik olarak bu URI bir GET gerçekleştirmesidir. Sonuç olarak, testim asla geçmez.

Sunucu yanıtımı doğrulayabilmem için HttpClient'in bir 301 aldığında otomatik olarak yeniden yönlendirmemesini nasıl yapılandırabilirim?

+0

Olası kopyalar [? Ben System.Net.Http.HttpClient 302 yönlendirmeleri izlemez alabilirsiniz Nasıl] (http://stackoverflow.com/questions/10453892/how-can -i-get-sistem-net-http-httpclient-to-not-izleyin-302-yönlendirmelere) –

cevap

67

Dene:

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

HttpClient client = new HttpClient(handler); 
ait
İlgili konular