C#中的GetResponse()

时间:2013-12-16 11:14:01

标签: c# rest httpwebrequest

我的便携式类库中有以下代码。但它给出了错误

  

System.Net.HttpWebRequest不包含定义   GetResponse()

public async Task<object> GetStateByUserId(string userID)
    {
        HttpWebRequest request;
        Stream receiveStream;
        StreamReader readStream;

        request =(HttpWebRequest)CreateGetWebRequest("state/uid/"+userID);
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {

        receiveStream = response.GetResponseStream ();
        readStream = new StreamReader(receiveStream);
        string str = readStream.ReadToEnd().ToString();
        s = JsonConvert.DeserializeObject<state>(str);
            return s;
        }


    }

任何人都知道为什么会这样吗?

2 个答案:

答案 0 :(得分:8)

如果您正在编写目标可移植类库,则必须使用异步方法,因为GetResponse不可用。

相反,您必须使用BeginGetReponseEndGetResponse

在您的情况下,这可能如下所示:

public void StartRequest ()
{
    HttpWebRequest request = (HttpWebRequest)CreateGetWebRequest("state/uid/"+userID);
    request.BeginGetResponse(new AsyncCallback(FinishRequest), request);
}

private void FinishRequest (IAsyncResult result)
{
    HttpWebResponse response = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;

    Stream receiveStream = response.GetResponseStream();
    StreamReader readStream = new StreamReader(receiveStream);

    // ...
}

如果您使用的是.NET 4.5,则可以这样做:

HttpWebRequest request = (HttpWebRequest)CreateGetWebRequest("state/uid/"+userID);
Task<HttpWebResponse> requestTask = Task.Factory.FromAsync<HttpWebResponse>(request.BeginGetResponse, request.EndGetResponse, request);
using (var response = await requestTask)
{
    Stream receiveStream = response.GetResponseStream();
    StreamReader readStream = new StreamReader(receiveStream);
}

答案 1 :(得分:1)

如果您查看the documentation for GetResponse()并将其与GetResponseAsync()进行比较,您会注意到在版本信息中,例如GetResponse()和其他版本的框架缺少Windows应用商店应用GetResponseAsync()中缺少。

根据您为PCL选择的框架版本,您可以直接使用GetResponseAsync()(例如,如果您选择.Net 4.5和Windows Store,则不能使用其他内容)。

如果您需要一些不支持GetResponseAsync()开箱即用的框架,那么我认为这里最好的解决方案是使用the Microsoft.Bcl.Async NuGet package,这将允许您使用{{1在其他版本的框架中。

此外,切换到GetResponseAsync()意味着您需要使用GetResponseAsync()来获取值,这也意味着要使此方法和所有调用它的方法await。 (虽然令人困惑,但似乎你已经切换到async而没有使用async,这没有多大意义。)