我如何在 asp.net webforms 中实时监听 webhooks?

How can I listen in real-time for webhooks in asp.net webforms?

我正在尝试从我的 asp.net 网络表单应用程序中的站点 https://www.unbounce.com 捕获 webhook。

我在 WebHookHandler.cs

中创建了 HttpAsyncHandler
public class WebHookHandler:IHttpAsyncHandler
{
    public WebHookHandler()
    {
    //
    // TODO: Add constructor logic here
    //
    }
    public bool IsReusable { get { return false; } }
    public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
    {
        context.Response.Write("<p>Begin IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");
        AsynchOperation asynch = new AsynchOperation(cb, context, extraData);
        asynch.StartAsyncWork();
        return asynch;
    }

    public void EndProcessRequest(IAsyncResult result)
    {
    }

    public void ProcessRequest(HttpContext context)
    {
        throw new InvalidOperationException();
    }
}
class AsynchOperation : 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 AsynchOperation(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)
    {
        _context.Response.Write("<p>Completion IsThreadPoolThread is " + Thread.CurrentThread.IsThreadPoolThread + "</p>\r\n");
        _context.Response.Write("Hello World from Async Handler!\r\n");
        using (var reader = new StreamReader(_context.Request.InputStream))
        {    
            string postData = reader.ReadToEnd();
            _context.Response.Write(postData);
        }


        _completed = true;
        _callback(this);
    }
}

并注册我的处理程序并将地图添加到 web.config

<add verb="*" path="webhook.handler" name="WebHookAsyncHandler" type="WebHookHandler"/>

这一切其实都是从msdn上截取的(没有名气,sorry)

接下来,另一个站点 (unbounce.com) POST 是这样的:

data.json: {"time_submitted":["04:59 PM UTC"],"page_uuid":["3282389-f13a-44b0-9a49-6321b515d43"],"email":["test@test.com"],"page_name":["Test name"],"date_submitted":["2017-07-17"],"name":["tester"],"ip_address":["80.80.80.80"],"page_url":["http://somepage.url"],"variant":["a"]}

每次用户按下按钮。 POST url 是:example.com/webhook.handler

但是我没有得到发布的数据。输出为:

Begin IsThreadPoolThread is True
Completion IsThreadPoolThread is True
Hello World from Async Handler! 

我也试过在 StreamReader 之前使用 _context.Request 和 _context.Request.Form,但它们每次都是 NULL。

我想,我对这些东西的工作原理有一些普遍的误解。你能帮我在页面上显示来自 POST 对我网站的请求的数据吗?

好吧,事实证明,我的列表中的一切都很好。 您只需要设置一个良好的测试环境来捕捉这些 POST,或者更好的是,您自己完成它们。