我正在尝试编写调用网页,然后发布到输出JSON文件的Web服务。
我遇到的问题是GetAsync返回响应的空值。这反过来也没有为GetTestResultAsync方法回调提供正确的URL。
这是我的代码:
static HttpClient client = new HttpClient();
static async Task RunAsync()
{
// New code:
client.BaseAddress = new Uri("http://10.1.10.10:8080/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
Uri url = await CallTestAsync();
string response = await GetTestResultAsync(url.PathAndQuery);
Console.WriteLine(response);
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
static async Task<Uri> CallTestAsync()
{
HttpResponseMessage response = await client.GetAsync("test.html");
response.EnsureSuccessStatusCode();
// return URI of the created resource.
return response.Headers.Location;
}
static async Task<string> GetTestResultAsync(string path)
{
HttpResponseMessage response = await client.GetAsync(path);
string streamResponse = string.Empty;
if (response.IsSuccessStatusCode)
{
streamResponse = await response.Content.ReadAsStringAsync();
}
return streamResponse;
}
static void Main(string[] args)
{
RunAsync().Wait();
}
答案 0 :(得分:0)
HttpClient
会自动重定向 3xx 响应,这意味着您在调用GetAsync
时获得的响应将不会包含位置标头因为它已经重定向到正确的位置。
要覆盖此行为,您必须提供已禁用此功能的HttpMessageHandler
。例如:
static HttpClientHandler handler = new HttpClientHandler { AllowAutoRedirect = false };
static HttpClient client = new HttpClient(handler);
这里的重要部分是将处理程序的AllowAutoRedirect
设置为false
。
重要提示:通过覆盖重定向响应的默认行为,您必须手动处理任何 3xx ,这可能会为您添加不必要的工作,因为在许多情况下默认情况下默认行为就足够了。如果你原样离开它,它已经为你做了第二次请求。
另请注意, 3xx 响应不是成功回复,这意味着如果您在致电{{1}时未使用自动重定向功能它会抛出异常。
此外,尽管大多数服务器对于诸如 Accept 标头之类的标头都非常宽容,但在这种情况下,您最有可能使用错误的服务器,因为HTML页面应该是{{1而不是response.EnsureSuccessStatusCode();
(当期望JSON对象作为响应时应该使用它。)