2012-02-22 9 views
3

現在、このコードを使用して、ファイルダウンロードの最終チャンクが送信されたかどうかを確認しています。より良いオプションについて:最後にダウンロードしたファイルのダウンロード時に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

+0

多分これは役立ちます: –

+0

感謝をhttp://awstats.sourceforge.net/docs/awstats_extra.html#abortedが、私は、ログの解析よりもリアルタイム何かを願っています。ログに追加する前にIISがASP.NETイベントを起動しても、ログオンしても問題はないようです。 – eselk

答えて

0

より多くの私はpageasyntaskについて読んを使用している、それは実際にはそれほど悪くは見えません。私はBeginWriteを使用して行く方法だと思う。

+0

私はその方法について具体的にはわかりませんが、はい、Asyncはあなたが行きたいと思う方法です。 –

関連する問題