1

Web アプリケーション内で IP カメラをストリーミングする必要があります。通常、URL を img タグに追加してこれを行います。今回の問題は、リクエストにダイジェスト認証が必要なことです。このため、認証を処理し、データをクライアントにストリーミングするプロキシ メソッドを作成したいと考えています。現在、HttpHandler を使用してこれを実行しようとしています。

using System;
using System.Net;
using System.Web;

public class HelloWorldHandler : IHttpHandler
{
    #region IHttpHandler Members

    private const int BUFFERSIZE = 1048576;

    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        HttpWebRequest webRequest = null;

        #region Prepare the request object
        webRequest = (HttpWebRequest)WebRequest.Create("http://url/cgi/image.php?type=live");
        webRequest.Method = "GET";
        webRequest.ContentType = "multipart/x-mixed-replace; boundary=------MJPEG FAME--------";
        webRequest.Credentials = new NetworkCredential(username, password);
        #endregion Prepare the request object

        #region Cycle through and return output
        HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();

        // GETS STUCK HEAR FOR OBVIOUS REASONS.  NOT SURE HOW TO BUFFER A CHUNK, STREAM THE CHUNK AND REPEAT
        System.IO.Stream fileStream = webResponse.GetResponseStream();

        Byte[] buffer = new byte[1048576];
        int bytesRead = 1;
        context.Response.ContentType = "image/png";
        while (bytesRead > 0)
        {
            bytesRead = fileStream.Read(buffer, 0, BUFFERSIZE);
            if (bytesRead == BUFFERSIZE)
                context.Response.OutputStream.Write(buffer, 0, buffer.Length);
            else if (bytesRead > 0)
            {
                byte[] endBuffer = new byte[bytesRead];
                Array.Copy(buffer, endBuffer, bytesRead);
                context.Response.OutputStream.Write(endBuffer, 0, endBuffer.Length);
            }
        }

        fileStream.Dispose();
        webResponse.Close();
        #endregion Cycle through and return output
    }

    #endregion
}

コード内の私のコメントを見ると、コードが失敗している明らかな場所をマークしています。応答ストリームを取得しているとき、メモリ例外がスローされるまで終了しません。これは明らかなようですが、バッファの問題を実際に処理する方法がわかりません。チャンクをバッファリングし、ストリーミングし、葯をバッファリングして繰り返すことができる必要があると思います。

参考までに、ブラウザ経由で直接接続したときのヘッダーの例を示します。

リクエスト

GET http://url/cgi/image.php?type=live HTTP/1.1
Host: url
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Authorization: Digest something something something

応答

HTTP/1.1 200 OK
X-Powered-By: PHP/5.3.10-1ubuntu3.8
Content-type: multipart/x-mixed-replace; boundary=------MJPEG FAME--------
Transfer-Encoding: chunked
Date: Mon, 04 Nov 2013 23:39:22 GMT
Server: lighttpd/1.4.28

アドバイスをいただければ幸いです。

ありがとう、

チャド

4

1 に答える 1