私は Windows 2008 で IIS7 の Web サイトを持っています。java-script から http-handler で mp3-file を書きます:
var audio = document.getElementById("audio");
audio.src = GetMultimedia.ashx?F=" + filename;
audio.load();
audio.play();
GetMultimedia.ashx:
Response.ClearHeaders();
Response.ClearContent();
Response.Clear();
Response.ContentType = "audio/mp3";
Response.AddHeader("content-length", FileLength().ToString());
Response.AddHeader("Connection", "keep-alive");
Response.BufferOutput = true;
GetFile(ref FileBuffer); // I get buffer of mp3-file for writing to Response
if (FileBuffer != null)
{
ms = new MemoryStream(FileBuffer, 0, FileBuffer.Length, true);
if (Response.IsClientConnected == true)
{
ms.CopyTo(Response.OutputStream);
Response.Flush();
}
}
問題: Windows ではどのブラウザでも正常に動作しますが、Android (Opera、内部ブラウザ) では http-handler が 12 回動作します (以下のログ)。このハンドラーが 11 回呼び出された後、IIS は retcode 200 0 64 を書き込みます。そのため、http-handler が複数回呼び出されるため、Response の mp3-file は元のものとは異なります。
2012-11-11 15:54:13 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 64 1069317 261 8626
2012-11-11 15:54:13 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 2236677 261 8330
2012-11-11 15:56:15 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 140
2012-11-11 15:56:18 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 140
2012-11-11 15:56:22 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 296
2012-11-11 15:56:25 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 124
2012-11-11 15:56:29 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 249
2012-11-11 15:56:32 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 171
2012-11-11 15:56:35 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 140
2012-11-11 15:56:38 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 140
2012-11-11 15:56:41 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 140
2012-11-11 15:56:44 GET /GetMultimedia.ashx V=f.mp3 HTTP/1.1 stagefright/1.2+(Linux;Android+4.0.3) 200 0 0 255 284 109