considerar un servicio API Web ASP.NET que redirige¿Cómo se configura HttpClient para que no se redirija automáticamente cuando recibe un código de estado HTTP 301?
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 POST'ing a "api/la" redirigirá a que "api/eso", tengo el siguiente método de ensayo:
[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 un código de estado HTTP se envía al cliente con la cabecera Location correcta y que HttpClient a continuación, realiza automáticamente un GET en ese URI. Como resultado, mi prueba nunca pasa.
¿Cómo configuro el HttpClient para que no se redirija automáticamente cuando recibe un 301 para que pueda verificar que la respuesta de mi servidor?
duplicado posible de [? ¿Cómo puedo llegar a System.Net.Http.HttpClient no sigue las redirecciones 302] (http://stackoverflow.com/questions/10453892/how-can -i-get-system-net-http-httpclient-to-not-follow-302-redirects) –