C#WebApi等待WebHook响应

时间:2016-03-04 05:18:29

标签: c# asp.net-web-api webhooks

我有一个Web服务,它接收来自客户端的帖子,并最终向另一家公司托管的其他Web服务发送请求。该公司使用Callback / Webhook模型,您在其中发送请求,他们立即回复204,然后他们通过http post将完成的结果发送到我已配置的URL(其运行时间很长,有时可能需要一段时间) )。

我想等待一段时间来查看是否及时从其他公司返回响应(例如20秒超时),然后返回其他公司的响应结果。如果他们在超时期限内没有回复,我只会将一般结果返回给我的客户,并提供有关他们以后可以在何处获取其余数据的其他信息。

我想弄清楚的是我如何让一个API控制器等待另一个API控制器的请求,然后从该控制器获取数据。我认为某种事件系统是合适的:

  1. 客户向控制器A上的api端点发送请求
  2. 控制器A将处理程序注册到由控制器B引发的事件
  3. 第三方向控制器B发送Http请求
  4. 控制器B发布控制器A正在侦听的事件以及来自第三方帖子的数据
  5. 控制器A(如果未达到超时)返回对客户端的响应
  6. 这需要相当多的实用程序代码才能工作。有没有更好的方法来处理带有webhooks api的请求/响应模型?

1 个答案:

答案 0 :(得分:0)

这是我到目前为止所提出的。

            var _response = null;


        //send http request to platform, get back 204
        ...
        var sw = new Stopwatch();
        sw.Start();

        //subsribe to messages being published
        MessagePublisher.MessageReceived += OnMessageReceived;

        try
        {
            while (true)
            {
                if (_response != null)
                    return _response; //we got a response

                if (sw.ElapsedMilliseconds > _messageTimeout)
                {
                    return null; //todo handle not receiving a response from the webhooks
                }
            }
        }
        finally
        {
            //unregister event
            MessagePublisher.MessageReceived -= OnMessageReceived;
        }
    }

    private void OnMessageReceived(object sender, Message message)
    {
        //TODO convert the message to a filled in webservice response
        _response = new WebServiceResponse();
    }
}

// publishes the message when the other controller receives it
public static MessagePublisher
{
    public static event EventHandler<Message> MessageReceived;

    public static void OnMessageReceived(Message result)
    {
        EventHandler<Message> handler = MessageReceived;

        if (handler != null)
        {
            handler(null, result);
        }
    }   
}