【问题标题】:GetResponse() in C#C# 中的 GetResponse()
【发布时间】:2014-09-16 19:36:41
【问题描述】:

我的可移植类库中有以下代码。但它给出的错误是

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;
        }


    }

有人知道为什么会这样吗?

【问题讨论】:

  • 我在第一行问题中已经提到了这一点
  • 你在写什么样的应用程序?它是 Windows 应用商店应用程序吗?
  • documentation 另有说明;你能显示完整的堆栈跟踪吗?
  • 你们为什么不阅读这个问题?错误在那里,应用程序的类型也是如此:可移植类库。
  • 不,我正在创建将用于所有移动平台的 PCL。当我在 android 平台上使用此代码时,它运行良好,但在创建 PCL 时,它给出了该错误。

标签: c# rest httpwebrequest


【解决方案1】:

如果您正在为可移植类库编写代码,则必须使用异步方法,因为 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);
}

【讨论】:

  • 为什么这被否决了? Seems correct enough to me.
  • 我很困惑。我自己从来没有使用过 PCL,但是那个“支持可移植类库”的图标对我来说似乎很清楚?
  • @poke 我没有投反对票,因为代码在技术上是正确的,但是: 1. 我认为在新代码中使用这种旧的异步模式是个坏主意,你应该使用async-@ 987654328@ 代替。 2. 文档实际上令人困惑,因为如果您指定目标框架的某些子集,您可以在 PCL 中使用GetResponseAsync()
  • @svick 我在添加示例代码之前收到了反对票;而且我使用了“经典”异步代码,因为我不知道 OP 使用的是哪个 .NET 版本(当时,问题没有被编辑以显示方法声明的 async 部分)。
  • 我以前试过这个。但我得到了同样的错误。@poke 先生。
【解决方案2】:

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

根据您为 PCL 选择的框架版本,您可能可以直接使用 GetResponseAsync()(例如,如果您选择了 .Net 4.5 和 Windows 应用商店,但仅此而已)。

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

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

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2014-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多