.NET Web服务 - 快速确认,但继续在后台

问题描述:

我建设将由供应商的应用程序使用.NET Web服务处理,我不知道如何实现以下目标:.NET Web服务 - 快速确认,但继续在后台

  • 供应商会通过一些信息给我的webserivce打电话,但希望快速返回确认信息,只是说明我收到了他们的信息。他们不在乎我如何处理它,也不希望承认我已完成处理。
  • 我传递的信息需要在幕后做些事情,并以时间敏感的方式对信息采取行动 - 即在几分钟内采取一些行动。我会联系一些其他的Web服务,以及做一些数据库工作。显然,这是在我对调用应用程序的“成功”作出回应之后。

我无法控制供应商访问我的服务的方式,他们用来调用它的方法是同步的,所以我需要快速响应让调用应用程序继续工作。在我看来,有两个选择,虽然我对其他人开放:

  1. 由于调用应用程序基本上是提交到一个队列,以便我已经写了可以处理它的过程中,我可以有Web服务只需将该项目提交给数据库(或MSMQ或其他队列),然后返回成功。队列进程将从那里接收处理。
  2. 理想情况下,我想我的服务可能会返回“成功”,然后继续自己处理,但我不确定这是否可能。由于我的处理是时间敏感的,因此启动新请求的后端处理是理想的,因此等待时间最短。

有没有其他想法,或者这些声音中的一个更可取?

我觉得1st是唯一可能的解决方案。第二是非常糟糕的设计。假设你处理每个请求1秒,平均有1秒内有2个请求。您将很快耗尽资源(因为将使用越来越多的线程)

第一个问题很好,因为您可以完全控制如何存储和处理请求。良好的设计是将Web服务作为前端,只会回答“成功”和入队请求。作为一个持久存储,我推荐MSMQ或数据库。然后创建一个服务应用程序,它将拥有线程池并从队列(db)中选择。

+0

+1 - 第一种选择是容错,更具可扩展性,在初始投资后维护和扩展会更容易,从而在应用程序中更好地分离关注点。如果这些事情不重要,我只考虑选项二,或者不如让您的服务快速启动和运行那么重要。 – 2010-03-01 15:58:55

+0

有趣的想法 - 直到我发布我没有想到,我基本上只是在自己的队列中滚动。有没有办法让我发送命中到某个地方的Windows服务,让它知道新的队列项,因为我将它存储在数据库中,还是需要等待服务检查队列本身并看到新的项目? – SqlRyan 2010-03-01 16:49:40

+0

@rwmnau - 我只是配置服务来检查队列本身。如果您使用的是.NET System.Messaging API,则可以在一个循环中执行“MessageQueue.Receive”,并有合理的超时时间。当它超时时,检查服务是否正在关闭。如果是这样,请打破循环,否则返回接收消息。进程将在写入目标队列后立即选择消息。 (除了在短时间内检查它是否应该关闭) – 2010-03-01 17:37:09

  1. 接收请求(用一个BackgroundWorker例如)
  2. 分拆后台进程与传入的参数
  3. 返回确认 - 与请求
  4. 做你的处理的GUID或类似标识符...
    1. 在此期间,呼叫者可以ping你的服务基础上,标识
    2. 状态更新而处理发生,返回一个“仍在工作”的响应,或者如果你很聪明或者可以准确地预测它,则返回一个进度度量(可能是完成的百分比或剩余的时间量)
  5. 当处理完成后,返回一个“成功”的消息在状态请求
  6. 使溶液可通过您与早期

选项1回答标识符是要走的路,因为应用程序已经支持排队。

至于选项2 - 您可以从您的Web服务启动工作线程,这将处理工作,您可以继续从主线程返回“成功”。