C#中的GetResponse()

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

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

 public async Task 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(str); return s; } } 

谁知道为什么会这样?

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

相反,你必须使用BeginGetReponse和EndGetResponse 。

在您的情况下,这可能是这样的:

 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 requestTask = Task.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request); using (var response = await requestTask) { Stream receiveStream = response.GetResponseStream(); StreamReader readStream = new StreamReader(receiveStream); } 

如果您查看GetResponse()的文档并将其与GetResponseAsync()进行比较,您会注意到在版本信息中,例如GetResponse()缺少Windowsapp store应用,并且GetResponse()中缺少其他版本的框架。

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

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

此外,切换到GetResponseAsync()意味着您将需要使用await来获取值,这也意味着使此方法和所有将其称为async方法。 (虽然令人困惑,似乎你已经在不使用await情况下切换到async ,这没有多大意义。)