在使用ASP.Net Web AI的.Net客户端中使用c#HttpClient的正确方法

在使用ASP.Net Web AI的.Net客户端中使用c#HttpClient的正确方法,c#,asp.net,asp.net-web-api,dotnet-httpclient,C#,Asp.net,Asp.net Web Api,Dotnet Httpclient,我正在开发一个Web ASP.NETAPI来扩展我们当前的桌面应用程序。 在基于令牌的身份验证的实现过程中,我遇到了一些线程异常问题,在寻找解决方案时,我产生了一些疑问。 因此,使用HttpClient时,它应该是在第一次请求时初始化的静态文件,还是在客户端每次访问API时创建的文件。 我想没有直截了当的答案,但我想听听你的意见 谢谢编辑 显然,MSDN不是最新的,HttpClient支持多线程。请查看评论以了解更多详细信息 简短回答 每次客户端访问API时创建httpclient 回答不太长

我正在开发一个Web ASP.NETAPI来扩展我们当前的桌面应用程序。 在基于令牌的身份验证的实现过程中,我遇到了一些线程异常问题,在寻找解决方案时,我产生了一些疑问。 因此,使用HttpClient时,它应该是在第一次请求时初始化的静态文件,还是在客户端每次访问API时创建的文件。 我想没有直截了当的答案,但我想听听你的意见

谢谢编辑

显然,MSDN不是最新的,HttpClient支持多线程。请查看评论以了解更多详细信息


简短回答

每次客户端访问API时创建httpclient

回答不太长

根据报告:

线程安全性

的任何公共静态在Visual Basic中共享)成员 这种类型是线程安全的。任何实例成员都不能保证 线程安全

在每次请求时创建一个新实例将确保您永远不会遇到任何多线程问题。它可能在内存占用方面效率不高,但它是安全的


如果您确实知道自己在做什么(如果您确定只有一个线程会同时调用您的httpclient),那么您可以创建一个共享客户端。要执行此操作,您可以查看示例。

推荐阅读:。不,这是错误的
HttpClient
旨在为许多并发请求共享。请参阅我上面链接的文章,这是一个重复的问题,以及这个问题的答案:。此外,现在我们有了async/await和TPL,使用较低级别的线程同步结构(如信号量)的需求已经减少。现在我很少向任何人推荐这个。(知道如何正确使用它的人是那些最不可能需要推荐的人。)
不,这是错误的。HttpClient被设计为可以为许多并发请求共享
>好吧,这不是MSDN所说的,但这不会是MSDN第一次愚弄我:D。无论如何,OP会得到线程异常,那么该信任谁呢?你还是MSDN?如果看不到导致异常的OP代码,很难说出哪里出了问题。但请注意,不是我反对MSDN;甚至微软(Patterns and Practices group)的人也说应该共享
HttpClient
。是的,我同意你的看法。是否有可能HttpClient在以前的.NET版本中不是线程安全的,并且没有使用新版本更新MSDN?也许OP使用的是旧版本的.NET?谢谢stakx,你发送的链接就是它。