Saya mencoba memahami apa yang tampaknya salah dari jejak tumpukan ini. Apa itu "Nilai" dalam konteks ini dan bagaimana fungsi Any sederhana melempar pengecualian dalam kasus khusus ini.

Jejak Tumpukan:

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()
........

Dan inilah baris 173 dari HomeController:

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");
0
Robert 11 Mei 2021, 17:07

1 menjawab

Jawaban Terbaik

Mengikuti komentar saya sebelumnya...

Dari penyelidikan lebih lanjut melalui ILSpy, saya tidak dapat menemukan metode yang dapat menambahkan objek null HeaderStoreItemInfo. Semua tempat kandidat tampaknya dijaga dengan baik oleh pemeriksaan nol.

Sementara itu, tampaknya kelas HttpHeaders TIDAK thread-safe, yang berarti bahwa thread yang berbeda secara bersamaan mengatur properti dapat merusak kamus internal. Efek serupa mungkin terjadi ketika membaca sementara sesuatu yang lain sedang menulis.

Saya sarankan menambahkan kunci sinkronisasi di sekitar kedua kode yang memodifikasi dan menggunakan header.

CATATAN: FacebookShares adalah membaca dan menulis header; apakah mungkin dua utas menjalankan metode sych secara bersamaan?

Sebagai contoh:

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");
    }
}

Anda harus memeriksa kode Anda untuk menambahkan kunci yang sama persis di mana saja facebokPingHttpClient.DefaultRequestHeaders dapat dimodifikasi.

1
Rubidium 37 12 Mei 2021, 08:45