我有以下C#方法接受URL作为输入并返回该位置存在的文本数据:
public string GetWebData(string uri)
{
string response = string.Empty;
try
{
var request = WebRequest.Create(uri);
request.BeginGetResponse(result =>
{
var httpRequest = (HttpWebRequest)result.AsyncState;
var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(result);
using (var reader = new StreamReader(httpResponse.GetResponseStream()))
{
response = reader.ReadToEnd();
}
}, request);
}
catch (WebException)
{
response = string.Empty;
}
return response;
}
但是, reader.ReadToEnd(); 方法返回一个空字符串。我不确定我做错了什么,因为这个方法在语法上似乎与我所咨询过的所有教程完全相同。我做错了什么?
答案 0 :(得分:1)
您立即返回response
- 即使为response
指定有用值的回调只会稍后触发。你明白BeginGetResponse
是如何运作的吗?值得仔细研究文档和示例。
如果您希望在方法完成后立即返回值,为什么使用异步方法?如果您已经拥有异步方法(例如,您使用的是Windows Phone),那么您应该坚持使用该异步惯用语 - 不要尝试使其同步。
顺便说一下,吞下这样的例外也是一个非常糟糕的主意 - 你几乎永远继续好像一切都好,即使你做想要忽略就用户体验而言,这个错误几乎肯定会记录异常。
此外,当您获取回复时,您应使用using
语句WebResponse
实施IDisposable
。