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
,这没有多大意义。)