# 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);
})
```