私は着信要求をチェックし、場合によっては何らかの機能を実行するHttpHandlerを持っています。チェックする必要がある条件の1つは、要求がbyte-range requestであるかどうかです。これはどうですか?.NET HttpHandlerのバイト範囲要求を検出する
答えて
ProcessRequest
メソッドに渡されたHttpContext
の一部であるRequest
オブジェクトのRange
ヘッダーを検索する必要があります。 HttpRequest
クラスにはRange
というプロパティがありませんので、Headers
を参照する必要があります。 Range
があれば、それは次の形式になります:
<start>
と
<end>
は整数で
Range: bytes=<start>-<end>
。例えば、誰かがファイルの途中から64Kを望んでいた場合:
Range: bytes=32768-98304
あなたは数字にテキストを解析し、それに応じて処理する必要があります。
Rangeヘッダー構文では、「0-500,100-1500」(複数の範囲)、「-500」(最後の500バイト)なども使用できます。詳細については、RFC 2616を参照してください。ここでは引用するには時間がかかりすぎます。
@ brent-kellerのコメントの上にリンクされたブログの投稿に基づいています。これは、CodePlex entryを参照しています。私は以下の編集を思いつきました。それはFDM(利用可能here)でテストされています。マルチレンジリクエストはサポートされていません(まだ)。 Web.config
の入力は必要ありません。
CodePlexの元のメソッドにエラーが含まれています。Accept-Ranges
ヘッダーの値は、返されるバイト範囲ではなく、単にbytes
でなければなりません。それはContent-Range
ヘッダーに属します。ダウンロードはまだ機能しますが、間違えた場合はbyte servingになりません。
この変更されたバージョンは、簡潔で読みやすくするためにリファクタリングされています。また、返されるファイルは必ずしも実際のURLに結びついているわけではないという利点があります。実際、ハンドラはブラウザから直接呼び出すことができ、必要に応じてクエリ文字列引数を使用して呼び出すこともできます。これにより、動的なファイル/データの作成と応答が可能になります。
うまくいけば、誰かがそれをうまくやってくれることを願っています。
HTTPハンドラ
Public Class Upload
Implements IHttpHandler
Public Sub ProcessRequest(Context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim oFile As FileInfo
oFile = New FileInfo(Context.Server.MapPath("~/0HCJ0LE.zip"))
Me.UploadRange(Context, oFile)
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
Private Sub UploadRange(Context As HttpContext, File As FileInfo)
Dim oResponse As Response
Dim oRequest As Request
Dim _
nOffset,
nLength As Long
Using oReader As New StreamReader(File.FullName)
Context.Response.AddHeader("Accept-Ranges", "bytes")
oResponse = New Response(oReader)
oRequest = New Request(oResponse, Context)
If oRequest.HasRange Then
If oRequest.IsMultiRange Then
' At the moment we only support single ranges.'
' * Multiple range support requires some more work'
' * to comply with the specifications: http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.2'
' *'
' * Multirange content must be sent with multipart/byteranges mediatype,'
' * (mediatype = mimetype)'
' * as well as a boundary header to indicate the various chunks of data.'
' '
' (?) Shoud this be issued here, or should the first'
' range be used? Or should the header be ignored and'
' we output the whole content?'
Me.ThrowBadRange(Context, oResponse)
Else
If oRequest.IsBadRange Then
Me.ThrowBadRange(Context, oResponse)
Else
Context.Response.StatusCode = 206
oResponse.Start = oRequest.Start
oResponse.End = oRequest.End
nOffset = oReader.BaseStream.Seek(oResponse.Start, SeekOrigin.Begin)
nLength = oResponse.End - oResponse.Start + 1
End If
End If
Else
nOffset = 0
nLength = oResponse.Size
End If
End Using
Context.Response.ContentType = MediaTypeNames.Application.Zip
Context.Response.AddHeader("Content-Disposition", $"attachment; filename={File.Name}")
Context.Response.AddHeader("Content-Length", nLength)
Context.Response.AddHeader(oResponse.HeaderName, oResponse.HeaderValue)
Context.Response.WriteFile(File.FullName, nOffset, nLength)
Context.Response.End()
End Sub
Private Sub ThrowBadRange(Context As HttpContext, Response As Response)
Context.Response.AddHeader(Response.HeaderName, Response.HeaderValue)
Throw New HttpException(416, "Requested range not satisfiable")
End Sub
End Class
レンジ要求
Friend NotInheritable Class Request
Public Sub New(Response As Response, Context As HttpContext)
Me.Response = Response
Me.Context = Context
End Sub
Public ReadOnly Property Start As Long
Get
If Me.Range(0) = String.Empty Then
Start = Me.Response.Size - Me.Range(1)
Else
Start = Me.Range(0)
End If
End Get
End Property
Public ReadOnly Property [End] As Long
Get
If Me.Range(0) = String.Empty Then
[End] = Me.Response.End
Else
If Long.TryParse(Me.Range(1), 0) Then
[End] = Me.Range(1)
Else
[End] = Me.Response.Size
End If
End If
[End] = Math.Min(Me.Response.End, [End])
End Get
End Property
Public ReadOnly Property HasRange As Boolean
Get
Return String.IsNullOrEmpty(Me.Context.Request.ServerVariables(HTTP_RANGE)) = False
End Get
End Property
Public ReadOnly Property IsMultiRange As Boolean
Get
Return Me.Context.Request.ServerVariables(HTTP_RANGE).Contains(",")
End Get
End Property
Public ReadOnly Property IsBadRange As Boolean
Get
Return Me.Start > Me.End OrElse Me.Start > Me.Response.Size - 1 OrElse Me.End >= Me.Response.Size
End Get
End Property
Private ReadOnly Property Range As List(Of String)
Get
Return Me.Context.Request.ServerVariables(HTTP_RANGE).Split("=")(1).Split("-").ToList
End Get
End Property
Private ReadOnly Response As Response
Private ReadOnly Context As HttpContext
Private Const HTTP_RANGE As String = "HTTP_RANGE"
End Class
レンジレスポンス
Friend NotInheritable Class Response
Public Sub New(Reader As StreamReader)
_Size = Reader.BaseStream.Length
Me.End = Me.Size - 1
End Sub
Public Property Start As Long
Public Property [End] As Long
Public ReadOnly Property Size As Long
Public ReadOnly Property HeaderName As String
Get
Return "Content-Range"
End Get
End Property
Public ReadOnly Property HeaderValue() As String
Get
Return $"bytes {Me.Start}-{Me.End}/{Me.Size}"
End Get
End Property
End Class
- 1. 最後のバイトのHTTP範囲要求
- 2. バイト範囲ダイジェストを計算する
- 3. Scalaのファイルからバイトの範囲を抽出します
- 4. .NET 2.0でlongの範囲を検証する方法は?
- 5. 範囲外のBTデバイスの検出
- 6. HTTP範囲要求の開始と終了のバイト(nodejs + mongodb)を決定する方法
- 7. 荷重センサーの検出範囲
- 8. バイト範囲要求を使用してオンデマンドでページをレンダリングする方法(pdf用)
- 9. ダッシュボタンのARP要求を検出する
- 10. coutブーストの範囲:要素の範囲
- 11. 別の範囲で範囲条件を検索する
- 12. バイト範囲と時間範囲をhtmlで変換する<video>
- 13. HttpHandlerゼロ長さのバイトを返す[]
- 14. railsメディアファイルストリームsend_dataまたはsend_fileメソッドによるバイト範囲要求を受け入れる
- 15. ブラウザはバイト範囲要求をどのような状況で送信しますか?
- 16. HTML5ビデオ要素が終了要求しません範囲
- 17. 32Feet - 範囲内のデバイスのみを検出する
- 18. .NET SyncFramework同期範囲
- 19. logstahを使用した範囲要求ヘッダーの解析
- 20. 検索範囲ゼロカウント
- 21. PHP - 検出悪い要求
- 22. リダイレクトユーザーの要求は私Global.asax.csファイルで特定のIP範囲
- 23. Http範囲リクエストによるGIFディメンションの高速検出
- 24. AAD:要求範囲 "openid email"は常にaccess_deniedになります
- 25. リクエストを検出/検証する悪意のある要求
- 26. 要求の範囲外のlocalとherokuアプリケーションのホスト名を取得する
- 27. CouchBaseの範囲の検索
- 28. Zillowの範囲検索
- 29. 重複範囲の検索
- 30. Django Haystack:MultiValueFieldの範囲検索
良い答え。将来の世代のために、少しサンプルコードがいいでしょう。私がそれを実装すると、私はあなたの答えにそれを注入するかどうか気にしないことを願っています。 – Larsenal
@Larsenal:私はサンプルコードを提供しませんでした。私は数年前にこれを使って作業したことを覚えていますが、コードは長くなくなっています。うまくいけば私の短い説明はあなたを始めるのに十分です。私はあなたが私の答えにコードを注入するかどうか気にしない。 –
FWIW、これは私に、遠隔地の要求を処理する方法を示すコードで次の記事を見つけることにつながります:http://blogs.visigo.com/chriscoulson/easy-handling-of-http-range-requests-in-asp-ネット/ –