2016-03-04 105 views
0

我有一个Web服务,它接收来自客户端的帖子,并最终将请求发送到另一个公司托管的其他Web服务。该公司使用Callback/Webhook模式发送请求,他们立即回复204,然后他们通过http post发送完成的结果到我已配置的url(它是一个长时间运行的进程,有时可能需要一段时间)。C#WebApi等待WebHook响应

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

我想弄明白的是,如何让一个API控制器等待一个请求到另一个API控制器,然后从该控制器获取数据。我想到的是某种事件系统的将是适当的:

  1. 客户发送请求到控制器API端点A
  2. 控制器A注册一个处理程序,由控制器B引发的事件
  3. 第三方发送HTTP请求将控制器B
  4. 控制器B发布事件控制器A沿侦听来自第三方数据发布
  5. 控制器A(如果没有达到超时)返回响应客户

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

+0

微软有ASP.NET WebHooks框架。 –

回答

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

你可能应该切换到'TPL',等待两个任务:来自完成源的任务,它将为您提供响应,以及等待时间的取消任务。这种无限循环是非常糟糕的解决方案。 – VMAtm