1

httphandler を使用して画像をダウンロードし、その画像をブラウザーに提供してから、もう一度実行できるかどうか疑問に思っていました。

現在、引き続き取得したい IP カメラからスナップショット イメージを生成する URL にアクセスできます。基本的に、スナップショットのスライド ショーを無期限に作成します。

画像をダウンロードして表示する方法はすでにわかっています。次のステップでは、より適切な用語がないため、プロセスを再帰的に繰り返します。

確かに、クライアントからの Ajax 呼び出しでこれを行うことができますが、サーバーでの処理を削除する方がはるかに望ましいでしょう。

ありがとう、

チャド

using Newtonsoft.Json.Linq;
using System;
using System.Net;
using System.Web;
using System.Threading;



namespace Something.App_Code
{
class CameraSnapshotHandler : IHttpAsyncHandler
{
    public bool IsReusable { get { return false; } }

    public CameraSnapshotHandler() { }

    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
    {
        SnapshotAsynchOperation asynch = new SnapshotAsynchOperation(cb, context, extraData);
        asynch.StartAsyncWork();
        return asynch;
    }

    public void EndProcessRequest(IAsyncResult result) { }

    public void ProcessRequest(HttpContext context)
    {
        throw new InvalidOperationException();
    }
}

class SnapshotAsynchOperation : IAsyncResult
{
    private bool _completed;
    private Object _state;
    private AsyncCallback _callback;
    private HttpContext _context;

    bool IAsyncResult.IsCompleted { get { return _completed; } }
    WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } }
    Object IAsyncResult.AsyncState { get { return _state; } }
    bool IAsyncResult.CompletedSynchronously { get { return false; } }

    public SnapshotAsynchOperation(AsyncCallback callback, HttpContext context, Object state)
    {
        _callback = callback;
        _context = context;
        _state = state;
        _completed = false;
    }

    public void StartAsyncWork()
    {
        ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);
    }

    private void StartAsyncTask(Object workItemState)
    {
        using (var client = new WebClient())
        {
            // Get Json data
            string username;
            string password;
            using (var credClient = new WebClient())
            {
                dynamic stuff = JObject.Parse(credClient.DownloadString(new Uri("http://www.some-url.com/servicestack/equipment-credentials.json?equipmentId=" + _context.Request.QueryString["id"])));
                username = stuff.Username;
                password = stuff.Password;
            }

            // Wait until we have full buffer before displaying
            _context.Response.BufferOutput = true;
            // Set content type to match
            _context.Response.ContentType = "image/png";

            // Digest Authenticate
            client.Credentials = new NetworkCredential(username, password);

            // Download into bit array
            byte[] content = client.DownloadData("http://some-url/cgi/image.php?type=snapshot");
            // Output stream to client
            _context.Response.OutputStream.Write(content, 0, content.Length);
        }

        _completed = true;
        _callback(this);
    }
}

}

4

0 に答える 0