我有一个Web服务,它接收来自客户端的帖子,并最终向另一家公司托管的其他Web服务发送请求。该公司使用Callback / Webhook模型,您在其中发送请求,他们立即回复204,然后他们通过http post将完成的结果发送到我已配置的URL(其运行时间很长,有时可能需要一段时间) )。
我想等待一段时间来查看是否及时从其他公司返回响应(例如20秒超时),然后返回其他公司的响应结果。如果他们在超时期限内没有回复,我只会将一般结果返回给我的客户,并提供有关他们以后可以在何处获取其余数据的其他信息。
我想弄清楚的是我如何让一个API控制器等待另一个API控制器的请求,然后从该控制器获取数据。我认为某种事件系统是合适的:
这需要相当多的实用程序代码才能工作。有没有更好的方法来处理带有webhooks api的请求/响应模型?
答案 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);
}
}
}