如何使用async和await执行HTTP GET请求

时间:2013-05-14 13:43:49

标签: c# httpwebrequest windows-phone-8

我试图创建一个将url作为参数并从中返回GET响应的函数,它只是在WebResponse responseObject intialization行中给出了一个错误

例外是An exception of type 'System.Net.ProtocolViolationException' occurred in mscorlib.ni.dll but was not handled in user code

public static async Task<string> get(string url)
{
    var request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
    request.Method = "GET";
    request.ContentType = "application/json";
    WebResponse responseObject = await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request);
    var responseStream = responseObject.GetResponseStream();
    var sr = new StreamReader(responseStream);
    string received = await sr.ReadToEndAsync();

    return received;
}

2 个答案:

答案 0 :(得分:6)

您无法为GET请求设置ContentType,因为您没有向服务器发送任何数据。

  

Content-Type =请求正文的MIME类型(与POST和PUT请求一起使用)。

这是ProtocolViolationException的来源。

看起来您想要设置Accept标题。

  

接受=内容 - 响应可接受的类型

(根据Wikipedia

尝试将代码更改为:

request.Accept = "application/json";

答案 1 :(得分:2)

尝试使用HttpClient,而不是这样:

    public async Task<List<MyClass>> GetMyClassAsync(
    CancellationToken cancelToken = default(CancellationToken))
    {
        using (HttpClient httpClient = new HttpClient())
        {
            var uri = Util.getServiceUri("myservice");
            var response = await httpClient.GetAsync(uri, cancelToken);
            return (await response.Content.ReadAsAsync<List<MyClass>>());
        }
    }