4

C#マルチスレッドWindowsサービスでのプッシュ通知の送信に問題があります。
APNSに多くの通知を送信すると、一部のスレッドが例外をスローします。

Unable to write data to the transport connection: An existing connection was forcibly closed by the remote host.
   at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Security._SslStream.StartWriting(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security._SslStream.ProcessWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslStream.Write(Byte[] buffer) ...

私は16スレッドのthreadPoolを持っており、各スレッドはAppleへの接続を開きます。
私が試したので、タイムアウトではありません:sslStream.WriteTimeout = 60000;
私も試しました:Client.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.KeepAlive, false);

送信開始時に接続が閉じられていません。

編集:私はすべてのデータが送信されたと思います、そしてAppleは突然接続を閉じます。

この例外の原因について知っていますか?どのように解決しますか?

必要に応じてコードを提供できます。

ご回答ありがとうございます!

4

5 に答える 5

4

「既存の接続がリモートホストによって強制的に閉じられた」という例外は、通常、接続を開いていた他のホストが、これ以上通信しないことを決定したことを意味します。これを行うために、RSTが設定されたFINを送信して、接続をその端からシャットダウンします。

これは多くの通知を送信するときに発生するため、サービスが過負荷を防ぐために意図的にスロットリングしている可能性はありますか?

于 2011-03-16T20:46:38.420 に答える
1

APNS-Sharpからユーザーが不正なデバイストークンを渡したときにこのエラーが発生するのを見てきました-http://code.google.com/p/apns-sharp/issues/detail?id= 35

それが答えではない場合、開いているスレッドの数を減らしたときにコードが機能しないことを確認できますか?それとも、少量のデータを送信するときに機能しますか?

これはさておき、16の接続を同時に開く必要が本当にありますか?これはかなり高いようです。

于 2011-03-20T12:19:43.767 に答える
1

開いている接続が多すぎて、何らかの理由でAppleのサーバーがそれらを閉じている可能性があります。接続数を減らしても問題が解決するかどうかを確認してください。

于 2011-03-22T20:03:28.357 に答える
1

これはプッシュ通知とは関係ありませんが、2つのスレッド(1つはデータの送信用、もう1つは受信用)間でソケットを共有していたため、最近マルチスレッドアプリケーションでこの問題が発生しました。受信スレッドがsocket.ReceiveFrom()でブロックしている間、送信スレッドは同じソケットでデータを送信しようとしました。これにより、アプリケーションで「リモートホストによって接続が強制的に閉じられました」というエラーが発生しました。これはあなたが調べるべきものかもしれません。

ソケット接続スレッドを安全にするためにWaitHandlesを追加して、問題を修正することになりました。

于 2011-03-21T14:43:35.550 に答える
0

解決策はありませんが、データが送信されなくなったときにソケットを再利用するために接続を閉じるのはAppleだと思います。

エラーを回避するために、現在は拡張通知を使用しています。

于 2011-07-04T18:24:17.953 に答える