问题描述
我试图从这个堆栈跟踪中了解似乎有什么问题。在这种情况下什么是“值”,在这种特定情况下,简单的 Any 函数如何抛出异常。
堆栈跟踪:
System.ArgumentNullException: Value cannot be null.
at System.Threading.Monitor.Enter(Object obj)
at System.Net.Http.Headers.HttpHeaders.ParseRawHeaderValues(String name,HeaderStoreItemInfo info,Boolean removeEmptyHeader)
at System.Net.Http.Headers.HttpHeaders.<GetEnumerator>d__20.MoveNext()
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source,Func`2 predicate)
at PortalCoreV2.Controllers.HomeController.<FacebookShares>d__19.MoveNext() in **********\Controllers\HomeController.cs:line 173
--- End of stack trace from prevIoUs location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptiondispatchInfo.Throw()
........
这是 HomeController 的第 173 行:
private static HttpClient facebokPingHttpClient = new HttpClient()
{
Timeout = TimeSpan.FromSeconds(1)
};
[responsecache(CacheProfileName = "Default",Order = int.MaxValue)]
public async Task<IActionResult> FacebookShares(string articleIds)
{
if (facebokPingHttpClient.DefaultRequestHeaders.Any(m => m.Key == "user-agent") == false) <--- line 173
facebokPingHttpClient.DefaultRequestHeaders.Add("user-agent","Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4");
解决方法
按照我之前的评论...
通过 ILSpy 的进一步调查,我无法找到可以添加 null
HeaderStoreItemInfo
对象的方法。
所有候选位置似乎都受到空检查的适当保护。
与此同时,HttpHeader
类似乎不是线程安全的,这意味着不同的线程同时设置属性可能会破坏内部字典。
阅读时可能会发生类似的效果,而其他东西正在写入。
我建议在修改和使用标头的代码周围添加同步锁。
注意:
FacebookShares
既是读头又是写头;是否有可能两个线程同时运行 sych 方法?
例如:
private static HttpClient facebokPingHttpClient = new HttpClient()
{
Timeout = TimeSpan.FromSeconds(1)
};
private static readonly object HeadersLock = new object(); // DECLARED LOCK
[ResponseCache(CacheProfileName = "Default",Order = int.MaxValue)]
public async Task<IActionResult> FacebookShares(string articleIds)
{
lock(HeadersLock) // ADDED LOCK
{
if (!facebokPingHttpClient.DefaultRequestHeaders.Any(m => m.Key == "user-agent"))
facebokPingHttpClient.DefaultRequestHeaders.Add("user-agent","Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4");
}
}
您必须检查您的代码,以在所有可能修改 facebokPingHttpClient.DefaultRequestHeaders
的地方添加完全相同的锁。