現在、このコードを使用して、ファイルダウンロードの最終チャンクが送信されたかどうかを確認しています。より良いオプションについて:最後にダウンロードしたファイルのダウンロード時にIISに通知する
Response.ClearHeaders()
Response.ClearContent()
Response.Clear()
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment;filename=""WebInstall.exe""")
Response.BufferOutput = False
Response.AddHeader("Content-Length", bytes.Length())
Dim bytesSent As Integer = 0
Do While Response.IsClientConnected And (bytesSent < bytes.Length())
Dim len As Integer
Dim bytesLeft As Integer = bytes.Length() - bytesSent
If bytesLeft > 80 * 1024 Then
len = 80 * 1024
Else
len = bytesLeft
End If
Response.OutputStream.Write(bytes, bytesSent, len)
Response.OutputStream.Flush()
bytesSent += len
Loop
If Response.IsClientConnected Then
AddToWebLog("Download completed")
NotifyAdProvider()
Else
AddToWebLog("Disconnected before download completed")
End If
Response.End()
上記のコードの問題は、ダウンロードの最後のチャンクが書き込まれるまで、私のASP.NETコードは、IISに戻ることができないということです。 ASP.NETを使用している人は、なぜこれが悪い設計なのかをよく知っています。それは、他の理由の中でも、使用可能なワーカースレッドの数が少ないことです。
私はこの情報をログに記録する必要があります。また、訪問者を私に送った人に支払う必要があるので、訪問者の15%は実際にダウンロードしません。おそらくブラウザからの警告、 - ウイルスなど - 私は余分な15%を支払う必要はありません、私の広告プロバイダはそれで大丈夫です)。
IISログには、接続が完了する前に閉じられていた場合、ステータスコードに "64"が含まれているため、この情報があります。だから、リクエストが "完了"されたときにIISがもう一度私に電話をかける方法を探していたら、おそらくIISログや何かにアクセスするためのAPIがあるかもしれません。それはキャッシュされ、すぐに書き込まれないため)。私は、 "長時間実行するタスク"を行う必要があるASP.NETページのためのいくつかの非同期メソッドを見てきましたが、それらは非常に複雑なように私は最後の手段としてそれを保存しています。
私はASP.NET 3.5とIIS 6
多分これは役立ちます: –
感謝をhttp://awstats.sourceforge.net/docs/awstats_extra.html#abortedが、私は、ログの解析よりもリアルタイム何かを願っています。ログに追加する前にIISがASP.NETイベントを起動しても、ログオンしても問題はないようです。 – eselk