【问题标题】:C# WebApi wait for WebHook responseC# WebApi 等待 WebHook 响应
【发布时间】:2016-03-04 05:18:28
【问题描述】:

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

我想等待一段时间,看看其他公司是否及时返回响应(例如 20 秒超时),然后返回其他公司的响应结果。如果他们在超时期限内没有响应,我只会向我的客户返回一个通用结果,其中包含有关他们以后可以从哪里获取其余数据的附加信息。

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

  1. 客户向控制器 A 上的 api 端点发送请求
  2. 控制器 A 向控制器 B 引发的事件注册处理程序
  3. 第 3 方向控制器 B 发送 Http 请求
  4. 控制器 B 发布控制器 A 正在侦听的事件以及来自 3rd 方帖子的数据
  5. 控制器 A(如果未达到超时)向客户端返回响应

不过,这需要相当多的实用程序代码才能工作。有没有更好的方法来使用 webhooks api 处理请求/响应模型?

【问题讨论】:

  • 微软有 ASP.NET WebHooks 框架。
  • ^ 是的,文档很糟糕。

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


【解决方案1】:

这是我到目前为止想出的。

            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);
        }
    }   
}

【讨论】:

  • 您可能应该切换到TPL,等待两个任务:来自完成源的任务,它将为您提供响应,以及在您等待的时间内取消任务。这种无限循环是相当糟糕的解决方案。
猜你喜欢
  • 2019-12-20
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2017-01-03
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多