C# WebApi 等待 WebHook 响应

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

微软有 ASP.NET 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,等待两个任务:来自完成源的任务,它将为您提供响应,以及在您等待的时间内取消任务。这种无限循环是相当糟糕的解决方案。

以上是关于C# WebApi 等待 WebHook 响应的主要内容,如果未能解决你的问题,请参考以下文章

C# 发布到 asp.net webapi Apiexception“响应的 HTTP 状态代码未排除 (201)。”

如何在 C# 中使用 HttpClient 读取 Web api 响应

Web API 2 返回 OK 响应但在后台继续处理

C# WebApi Xml序列化问题解决方法:“ObjectContent`1”类型未能序列化内容类型“application/xml;charset=utf-8"的响应正文。...

C# HttpClient 无需等待响应即可发布信息

C# Discord如何等待带有前缀的消息,然后响应它[关闭]