於是故事就這樣展開了
目前apns server是windows server 2012,web project 是asp.net 4.5
參考以下的方式改寫了推播apns那段
從此公主跟PG就過著幸福快樂的生活了.....想的美
當你trace到 var secretKey = CngKey.Import 時,會遇到「system cannot find the file specified 」例外,
可是明明路徑都正確啊......是的,你需要比較高的權限
相對的,你的application pool identity也要提高權限
相對的,你的application pool identity也要提高權限
然後....
你明明在IDE中執行httpClient.SendAsync都很正常,可是怎麼放在iis給他執行就出現這種例外
「call to SSPI failed, see inner exception. StackTrace: at System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
「call to SSPI failed, see inner exception. StackTrace: at System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
...
..
...」
答案是......server 2012的IIS不支援http/2
所以,請把你的server升級到server 2016再來打怪吧
花了半天升級了server,結果又是在httpClient.SendAsync出錯,這時是....「timeout」!?
可是明明在IDE debug確又正常啊.....
那就是要升級你的framework的時候了,把專案從4.5升級到4.6吧
(前輩如是說的.....https://stackoverflow.com/questions/32685151/how-to-make-the-net-httpclient-use-http-2-0)
還有,別再用httpTwo了而是用「WinHttpHandler」,如同第33則po文一樣--
-------------------
-------------------
1.Make sure you are on the latest version of Windows 10.
2.Install WinHttpHandler:
Install-Package System.Net.Http.WinHttpHandler
3.Extend WinHttpHandler to add http2.0 support:
public class Http2CustomHandler : WinHttpHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
request.Version = new Version("2.0");
return base.SendAsync(request, cancellationToken);
}
}
4.Pass above handler to the HttpClient constructor
using (var httpClient = new HttpClient(new Http2CustomHandler()))
{
// your custom code
}
---------------------------------
(所以就是要用非同步的方式去呼叫了,沒差,用執行緒去做就是了)
雖然案主說你就再申請一個apns 憑證嘛.何必這樣大費周章?
可是每一個憑證每年都要換證,就是怕在換證時uer漏接了重要的訊息
這次一做,日後很多個APP都可以共用,也沒有期限問題,長痛不如短痛啊,根本性地解決問題,不亦快哉?
沒有留言:
張貼留言