正确的方式来制作异步Web请求

时间:2016-05-30 15:35:39

标签: c# json async-await httpwebrequest system.net

您好我需要在C#中编写一个正确的异步Web请求函数来获取JSON格式的一些数据并在强类型对象中反序列化它。我提出了这个解决方案:

public async Task<TReturnType> MakeAsyncRequest<TReturnType>(string url) where TReturnType : class
{
    try
    {
        var request = (HttpWebRequest)WebRequest.Create(url);
        var response = await request.GetResponseAsync();
        var json = await Task.Run(() => ReadStreamFromResponse(response));
        var deserializedObject = await Task.Run(() => JsonConvert.DeserializeObject<TReturnType>(json));

        return deserializedObject;
    }
    catch (Exception)
    {
        // TODO: Handle exception here
        throw;
    }
}

private string ReadStreamFromResponse(WebResponse response)
{
    using (var responseStream = response.GetResponseStream())
    using (var sr = new StreamReader(responseStream))
    {
        return sr.ReadToEnd();
    }
}

使用方式如下:

var myData = await MakeAsyncRequest<IEnumerable<SomeObject>>(http://example.com/api/?getdata=all);

我面临的问题是,有时我的网络请求会触发并且永远不会返回,是否有正确的方法来处理它?也许玩定时器是一种选择,但我不喜欢去那里。

如果你能改进我的功能,也许我会感激不尽,也许有更好的方法来做事,而我却看不到它。

0 个答案:

没有答案