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