1

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

0 Answers0