I have a .net framework 4.6.2 application that is sometimes returning the following error in calls using HttpClient:
System.NullReferenceException: Object reference not set to an instance of an object.
Module "System.Net.Http.Headers.HttpHeaderParser", in ToString
Module "System.Net.Http.Headers.HttpHeaders", in ReadStoreValues
Module "System.Net.Http.Headers.HttpHeaders", in GetValuesAsStrings
Module "System.Net.Http.Headers.HttpHeaders", in GetHeaderString
Module "System.Net.Http.Headers.HttpHeaders", in GetHeaderStrings
Module "System.Net.Http.HttpClientHandler", in SetRequestHeaders
Module "System.Net.Http.HttpClientHandler", in CreateAndPrepareWebRequest
Module "System.Net.Http.HttpClientHandler", in SendAsync
Module "System.Runtime.ExceptionServices.ExceptionDispatchInfo", in Throw
File "C:\...\PersonService.cs", line 180, col 21, in GetPersonAsync
Here is the code that makes the call:
public async Task<Person> GetPersonAsync(Guid personId)
{
var request = new HttpRequestMessage(HttpMethod.Get, $"https://api.my-system.com/api/persons?id={personId}");
request.Headers.Add("Server-Token", _authorization.GenerateToken());
request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-msgpack"));
var response = await _httpClient.SendAsync(request);
if (response.IsSuccessStatusCode)
{
person = LZ4MessagePackSerializer.Deserialize<Person>(await response.Content.ReadAsByteArrayAsync(), MessagePack.Resolvers.TypelessContractlessStandardResolver.Instance);
}
return null;
}
And calling this method:
var person = await _personService.GetPersonAsync(perosonId);
The code that generates the token:
public string GenerateToken()
{
var claims = new List<Claim>()
{
new Claim("user", "my.user"),
};
if (Context.Current.SessionData.User != null && Context.Current.SessionData.User.Language != null)
{
var cultureClaim = new Claim("culture", Context.Current.SessionData.User.Language.Culture);
claims.Add(cultureClaim);
}
var expirationTime = new TimeSpan(1, 0, 0);
return GenerateToken(claims, expirationTime);
}
public string GenerateToken(IEnumerable<Claim> claims, TimeSpan expirationTime)
{
var tokenHandler = new JwtSecurityTokenHandler();
var securityKey = GetBytes("Secret");
var memoryKey = new SymmetricSecurityKey(securityKey);
var tokenDescriptor = new SecurityTokenDescriptor()
{
Issuer = "acms",
SigningCredentials = new SigningCredentials(memoryKey, "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256", "http://www.w3.org/2001/04/xmlenc#sha256"),
Subject = new ClaimsIdentity(claims)
};
if (expirationTime.TotalSeconds > 0)
{
var now = DateTime.UtcNow;
tokenDescriptor.Expires = now.AddSeconds(expirationTime.TotalSeconds);
}
var token = tokenHandler.CreateToken(tokenDescriptor);
var tokenString = tokenHandler.WriteToken(token);
return tokenString;
}
private byte[] GetBytes(string input)
{
var bytes = new byte[input.Length * sizeof(char)];
Buffer.BlockCopy(input.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
This error occurs intermittently, I've researched a lot and so far I haven't found any information that helps.
Has anyone seen this problem?
Thank you