.NET Core WindowSocketのエラーメモ

とあるテストで、かつ1回目にしか発生しないエラーに遭遇したメモ

.NET Coreも内部ではSocketを使ってるわけで、以下のようなエラーが起きることがあるようです。
https://support.microsoft.com/ja-jp/kb/819124

今回遭遇したものは、

WSA_OPERATION_ABORTED (オペレーティング システムに依存)

  • 意味 : 重複した操作が取り消されました。
  • 説明 : ソケットが閉じているか、WSAIoctl (Wsapiref_6ik2.asp) の SIO_FLUSH コマンドが実行されたため、重複した操作が取り消されました。

でした。先のログ出力をしていってわかったことでした。
というのもこのエラー、デバッグで実行しても発生しない。
Consoleとして起動しても発生しない。
ので、実際に使う上では問題なさそうなものでした。
ただ、テストコードのようにmsで動く世界だとどうしてもシビアなのかなぁというところで、一つ一つトレースしてました。

[14:18:19.7113][  21][0][Info] ExecProcess: outputLength6087
[14:18:19.7123][  21][0][Info] HttpResponseBody.Set Length=6060
[14:18:19.7123][  21][0][Info] CgiHandler.CreateFromCgi 
[14:18:19.7133][  21][0][Info] WebServer.OnSubThread SEND
[14:18:19.7143][  21][0][Info] 33768781 SockTcp.Send 31
[14:18:19.7143][  16][0][Info] Detail Web-localhost:7188 ::1 0000004 response HTTP/1.1 200 Document follows
[14:18:19.7143][  27][0][Info] 55071656 SockTcp.EndReceive Length=31
[14:18:19.7143][  27][0][Info] 55071656 SockTcp.BeginReceive
[14:18:19.7143][   4][0][Info] 55071656 SockTcp.LineRecv 31
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.SocketErrorCode:OperationAborted
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.ExceptionType:System.Net.Sockets.SocketException
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.ExceptionMessage:スレッドの終了またはアプリケーションの要求によって、I/O 処理は中止されました。
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.ExceptionMessage:One or more errors occurred. (スレッドの終了またはアプリケーションの要求によって、I/O 処理は中止されました。)
[14:18:19.7163][  28][0][Erro] 55071656 SockTcp.EndReceive Result.StackTrace:
[14:18:19.7163][  28][0][Erro] SockTcp.SetError 55071656 SockTcp.disconnect
[14:18:19.7173][  21][0][Info] 33768781 SockTcp.SendNoTrace 173
[14:18:19.7183][  21][0][Info] HttpResponseBody.Send encode=True
[14:18:19.7183][  21][0][Info] 33768781 SockTcp.SendNoTrace 6060

という具合に、問題の箇所は突如として、謎のエラーが出てるというところです。
これを、SocketExceptionとしてキャスト、エラーコードを調べてみたところ上のエラーにいきついたというころでした。
この「OPERATION_ABORTED」というのは、Socketそのものが切断されたためのものではないため、再度受信待機に入ることで対策しました。