为什么使用HttpClient进行同步连接?
我正在构build一个类库来与API进行交互。 我需要调用API并处理XML响应。 我可以看到使用HttpClient进行asynchronous连接的好处,但是我正在做的是纯粹的同步,所以看不到比HttWebRequests任何显着的好处。
如果任何人都可以摆脱任何光线,我将不胜感激。 为了这个原因,我不是一个使用新技术的人。
但是我正在做的是纯粹的同步
你可以使用HttpClient
进行同步请求就好了:
using (var client = new HttpClient()) { var response = client.GetAsync("http://google.com").Result; if (response.IsSuccessStatusCode) { var responseContent = response.Content; // by calling .Result you are synchronously reading the result string responseString = responseContent.ReadAsStringAsync().Result; Console.WriteLine(responseString); } }
至于为什么你应该使用HttpClient而不是WebRequest,那么HttpClient是块上的新手,并且可以包含对老客户端的改进。
我会重复Donny V.答案和Josh的
“我不会使用asynchronous版本的唯一原因是,如果我试图支持尚未内置asynchronous支持的.NET的旧版本。
(如果我有声望,请立即行动起来)
我不记得最后一次,如果有的话,我很感激HttpWebRequest为状态码> = 400抛出exception。为了解决这些问题,您需要立即捕获exception,并将它们映射到一些非exception响应机制在你的代码…本身无聊,乏味和容易出错。 无论是与数据库进行通信,还是实现定制的Web代理,“接近”总是希望Http驱动程序只是告诉您的应用程序代码返回的内容,并由您决定如何行事。
因此HttpClient是可取的。
我使用HttpClient的一个主要原因是因为在URL上返回404时,它不会引发exception。
如果您正在构build一个类库,那么您的库的用户可能会asynchronous使用您的库。 我认为那是最重要的原因。
你也不知道你的图书馆将如何使用。 也许用户将会处理大量的请求,并且这样做是asynchronous的,这将有助于它的执行速度更快,效率更高。
如果你可以简单地做到这一点,尽量不要让你的库的用户负担,试图使stream程asynchronous时,你可以照顾它们。
我不会使用asynchronous版本的唯一原因是如果我试图支持尚未内置asynchronous支持的.NET的旧版本。
在我的情况下,接受的答案是行不通的。 我从一个没有asynchronous行为的MVC应用程序调用API。
这是我设法使它工作的方式:
private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default); public static T RunSync<T>(Func<Task<T>> func) { CultureInfo cultureUi = CultureInfo.CurrentUICulture; CultureInfo culture = CultureInfo.CurrentCulture; return _myTaskFactory.StartNew<Task<T>>(delegate { Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = cultureUi; return func(); }).Unwrap<T>().GetAwaiter().GetResult(); }
然后我这样称呼它:
Helper.RunSync(new Func<Task<ReturnTypeGoesHere>>(async () => await AsyncCallGoesHere(myparameter)));