发布到HTTP并在c#中获取JSON响应

时间:2017-11-02 15:51:01

标签: c# asynchronous

我正在尝试编写调用网页,然后发布到输出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();
    }

1 个答案:

答案 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对象作为响应时应该使用它。)