HttpClient HTTP/2 从 Azure Function 调用 APN

Posted

技术标签:

【中文标题】HttpClient HTTP/2 从 Azure Function 调用 APN【英文标题】:HttpClient HTTP/2 call to APN from Azure Function 【发布时间】:2019-04-29 21:51:30 【问题描述】:

我正在使用 HttpClient 将 Apple 推送通知发送到 APN HTTP/2 服务器。我已经设法通过使用System.Net.Http.WinHttpHandler nuget 包使其工作:

var http = new HttpClient(new WinHttpHandler());
var request = new HttpRequestMessage(HttpMethod.Post, new Uri(url))

    Version = new Version(2, 0),
    Content = new StringContent(json)
;
// Set headers... Send... Read response... HTTP 200 OK

这在 Windows 上运行良好。问题是,其他任何地方都不支持 WinHttpHandler。例如,我无法从 Azure Functions 运行此代码。我的问题是 - 是否有任何使用 .NET Core 2.1 发送 HTTP/2 请求的跨平台方式,或者 Azure Functions 2.0 是否有任何变通方法使其正常工作?

【问题讨论】:

【参考方案1】:

我在 Azure Functions 2.0 上使用 WinHttpHandler 时遇到了问题。我已经设法使用here 的解决方法解决了它。基本上我把 .NET Standard 2.0 System.Net.Http.WinHttpHandler.dll 程序集放到函数项目的根目录下并添加了这个:

  <ItemGroup>
    <None Update="System.Net.Http.WinHttpHandler.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <Target Name="CopySPSM" BeforeTargets="Build">
    <Copy SourceFiles="System.Net.Http.WinHttpHandler.dll" DestinationFolder="$(OutputPath)\bin" />
  </Target>

有了它和设置 WEBSITE_LOAD_USER_PROFILE = 1 以使CngKey.Import 为 APN 签名 JWT 令牌,它开始工作。

【讨论】:

【参考方案2】:

当您的目标是 .NET Core 2.1 并发出 HTTP/2 请求时,它将降级到 HTTP/1.1。 您可以将 .NET Core 2.1 切换到不同的 HTTP 堆栈。 .Net Core 2.1 目前不支持 HTTP/2.0

所以,我建议您可以切换回支持 HTTP/2.0 的旧堆栈。更多详情可以参考这个issue。

【讨论】:

以上是关于HttpClient HTTP/2 从 Azure Function 调用 APN的主要内容,如果未能解决你的问题,请参考以下文章

从Angular HttpClient调用Async方法azure AI计算机视觉获取响应标头

在 Azure Function 上获取数据时,HttpClient.GetAsync() 会产生 AggregateException

HttpClient DocumentClient 不同线程会发生啥。 Azure 函数

Azure Functions 中的 HttpClient 最佳实践

httpClient 在从 azure 反向代理调用 https 连接时抛出连接重置

带有 .Get() 对 Azure 搜索 API 的请求的 Angular HttpClient“未知错误”