试图从 c# 中的给定堆栈跟踪中了解似乎有什么问题
Trying to understand what seems to be wrong from given stack trace in c#
我试图从这个堆栈跟踪中了解似乎出了什么问题。在这种情况下,“值”是什么以及在这种特定情况下简单的 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
object 的方法。
所有候选位置似乎都受到空检查的保护。
同时,HttpHeader
s class 似乎不是 thread-safe,这意味着不同线程同时设置属性可能会破坏内部字典。
在其他东西正在写入时阅读时可能会发生类似的效果。
我建议在修改和使用 headers 的代码周围添加同步锁。
注意:
FacebookShares
既是读又是写headers;是否有可能两个线程同时是 运行 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
可以修改。
我试图从这个堆栈跟踪中了解似乎出了什么问题。在这种情况下,“值”是什么以及在这种特定情况下简单的 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
object 的方法。
所有候选位置似乎都受到空检查的保护。
同时,HttpHeader
s class 似乎不是 thread-safe,这意味着不同线程同时设置属性可能会破坏内部字典。
在其他东西正在写入时阅读时可能会发生类似的效果。
我建议在修改和使用 headers 的代码周围添加同步锁。
注意:
FacebookShares
既是读又是写headers;是否有可能两个线程同时是 运行 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
可以修改。