# HttpClient出現System.NullReferenceException ## 狀況 今天遇到一個問題,當我在使用這段程式碼時 ```csharp private static HttpClient LoginWithJwtToken(string token) { Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); return Client; } var client = LoginWithJwtToken(token); client.GetFromJsonAsync<List<FileInfoViewModel>>(string.Format(GetResourceFileListUrlFormatting, ApiUrlBase, resourceType.GetName())); ``` 出現System.NullReferenceException,但是遇到這個問題的人零零散散 詳細錯誤如下: ``` System.NullReferenceException: Object reference not set to an instance of an object. at System.Net.Http.HttpConnection.WriteAsciiString(String s) at System.Net.Http.HttpConnection.WriteHeaderCollection(HttpHeaders headers, String cookiesFromContainer) at System.Net.Http.HttpConnection.WriteHeaders(HttpRequestMessage request, HttpMethod normalizedMethod) at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnection.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken) at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken) at Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler. ``` ## 錯誤原因 HttpClient在一般情況下都是Thread-safe,但是如果有透過DefaultRequestHeaders處理header,則不是Thread-safe ## 解法 既然我又要設定Token,又要多執行續,只有一個辦法,一直new一個新的HttpClient 那麼,就有兩個方案,一個就是傳統的new HttpClient() 我選擇另一個方案,因為我有用DI注入,所以在註冊服務的時候,將原本的 ```csharp services.AddHttpClient(""); ``` 改為 ```csharp services.AddHttpClient("", (service, client) => { client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", service.GetRequiredService<IOptions<AppConfig>>().Value.ApiToken); }) ```