考虑重定向的ASP.NET Web API服务
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;
}
}
Run Code Online (Sandbox Code Playgroud)
试图验证POST数据到"api/this"会将你重定向到"api/that",我有以下测试方法:
[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 …Run Code Online (Sandbox Code Playgroud) 我有以下方法返回Http status code给定的Url:
public static async void makeRequest(int row, string url)
{
string result;
Stopwatch sw = new Stopwatch(); sw.Start();
try
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = new HttpResponseMessage();
response = await client.GetAsync(url);
// dump contents of header
Console.WriteLine(response.Headers.ToString());
if (response.IsSuccessStatusCode)
{
result = ((int)response.StatusCode).ToString();
}
else
{
result = ((int)response.StatusCode).ToString();
}
}
}
catch (HttpRequestException hre)
{
result = "Server unreachable";
}
sw.Stop();
long time = sw.ElapsedTicks / (Stopwatch.Frequency / …Run Code Online (Sandbox Code Playgroud) 我有一个返回HTTP 302重定向的URL,我想获取它重定向到的URL.
问题是System.Net.WebClient似乎实际上遵循它,这很糟糕.HttpWebRequest似乎也这样做.
有没有办法制作一个简单的HTTP请求并返回目标位置而不使用WebClient?
我很想做原始套接字通信,因为HTTP很简单,但网站使用HTTPS,我不想做握手.
最后,我不关心我使用哪个类,我只是不希望它遵循HTTP 302重定向:)
我正在使用FlurlHttp,并且想对某些API调用禁用AllowAutoRedirect。我知道如何使System.Net.Http.HttpClient不遵循302重定向?
WebRequestHandler webRequestHandler = new WebRequestHandler();
webRequestHandler.AllowAutoRedirect = false;
HttpClient httpClient = new HttpClient(webRequestHandler);
// Send a request using GetAsync or PostAsync
Task<HttpResponseMessage> response = httpClient.GetAsync("http://www.google.com")
Run Code Online (Sandbox Code Playgroud)
但是对于Flurl,我只找到了与C#Flurl中所述类似的方法 -将WebRequestHandler添加到FlurlClient(我尚未编译下面的代码,因此可能会有一些错误)
public class HttpClientFactoryWithWebRequestHandler : DefaultHttpClientFactory
{
private readonly WebRequestHandler _webRequestHandler;
public HttpClientFactoryWithWebRequestHandler (WebRequestHandler webRequestHandler )
{
_webRequestHandler = webRequestHandler ;
}
public override HttpMessageHandler CreateMessageHandler()
{
var handler =_webRequestHandler ;
//Or var handler = new WebRequestHandler(_webRequestHandler );
return handler;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以为新的FlurlClient传递设置:
WebRequestHandler webRequestHandler = new …Run Code Online (Sandbox Code Playgroud)