我的便携式类库中有以下代码。但它给出了错误
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;
}
}
任何人都知道为什么会这样吗?
答案 0 :(得分:8)
如果您正在编写目标可移植类库,则必须使用异步方法,因为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<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
,这没有多大意义。)