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 最佳实践