Q: Bad Request with no reason I am attempting to upgrade to newest APNS connectivity functionality but when I submit a request I get a http 400 bad request result with no reason. What am I missing / doing wrong? 
 
Method for sending below:
public async void SendAsync(string deviceToken, string p8privateKey, string p8privateKeyId, string teamId)
{
    var path = $"/3/device/{deviceToken}";

    var obj = new
    {
        aps = new
        {
            alert = "test00001"
        }
    };
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(obj);

    var request = new HttpRequestMessage(HttpMethod.Post, new Uri("https://api.development.push.apple.com:443" + path))
    {
        Version = new Version(2, 0)           
    };

    string jwToken = CreateJwtToken(p8privateKey, p8privateKeyId, teamId);

    request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("bearer", jwToken);
    request.Headers.TryAddWithoutValidation(":method", "POST");
    request.Headers.TryAddWithoutValidation(":path", path);

    request.Headers.Add("apns-topic", "com.the-app");
    request.Content = new StringContent(json);


    string sReq = JsonConvert.SerializeObject(request);
    string jsonContent = request.Content.ReadAsStringAsync().Result;

    WinHttpHandler handler = new WinHttpHandler();
    HttpClient http = new HttpClient(handler);


    var t = await http.SendAsync(request);

}

Here are the other used methods:
private static string CreateJwtToken(string p8privateKeyId, string p8privateKey, string teamId)
{
    var header = JsonHelper.Serialize(new { alg = "ES256", kid = p8privateKeyId });
    var payload = JsonHelper.Serialize(new { iss = teamId, iat = ToEpoch(DateTime.UtcNow) });

    var key = CngKey.Import(Convert.FromBase64String(p8privateKey), CngKeyBlobFormat.Pkcs8PrivateBlob);

    using (var dsa = new ECDsaCng(key))
    {
        dsa.HashAlgorithm = CngAlgorithm.Sha256;
        var headerBase64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(header));
        var payloadBasae64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(payload));
        var unsignedJwtData = $"{headerBase64}.{payloadBasae64}";
        var signature = dsa.SignData(Encoding.UTF8.GetBytes(unsignedJwtData));

        return $"{unsignedJwtData}.{Convert.ToBase64String(signature)}";
    }
}

private static int ToEpoch(DateTime time)
{
    var span = DateTime.UtcNow - new DateTime(1970, 1, 1);
    return Convert.ToInt32(span.TotalSeconds);
}

I have limited to the payload to what I think is the bear minimum requirements. I am new to jwt/http2 and APNS. 
I could very well be missing something simple. 
