c#-4.0 - redireccionamiento - redirect 301
¿Cómo se configura HttpClient para que no se redirija automáticamente cuando recibe un código de estado HTTP 301? (1)
Tratar:
var handler = new HttpClientHandler()
{
AllowAutoRedirect = false
};
HttpClient client = new HttpClient(handler);
Considere un servicio ASP.NET Web API que redirige
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;
}
}
Tratando de verificar que los datos de POST a "api / this" lo redirigirán a "api / that", tengo el siguiente método de prueba:
[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());
}
Lo que realmente sucede es que se envía un código de estado HTTP al cliente con el encabezado de ubicación correcto y que HttpClient realiza automáticamente un GET en ese URI. Como resultado, mi prueba nunca pasa.
¿Cómo configuro HttpClient para que no se redirija automáticamente cuando recibe un 301 para que pueda verificar la respuesta de mi servidor?