首页 > 解决方案 > 试图从 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");

标签: c#stack-trace

解决方案


按照我之前的评论...

通过 ILSpy 的进一步调查,我找不到可以添加null HeaderStoreItemInfo对象的方法。所有候选位置似乎都受到空检查的适当保护。

同时,似乎HttpHeaders 类不是线程安全的,这意味着不同的线程同时设置属性可能会破坏内部字典。在其他内容正在写入时阅读可能会发生类似的效果。

我建议在修改和使用标头的代码周围添加同步锁。

注意: 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可以修改的地方添加相同的确切锁。


推荐阅读