C# 网络服务。获取输入数据,在后台线程进行处理

C# 网络服务。获取输入数据,在后台线程进行处理,c#,.net,web-services,asynchronous,C#,.net,Web Services,Asynchronous,我有几个web服务:asmx、wcf。在这两种方法中,有一些方法需要花费大量的时间进行处理,但这些方法的输入数据量很小,并且在导线上传输不需要太多时间。我想移动到不同步模型。客户端将数据传递给服务,服务回答数据传输是正确的,并在后台线程中处理数据,而不与客户端连接。因此,agter传输连接应关闭。可能吗?你能帮我写文章吗,或者可能只是谷歌的请求。不要用ASMX web服务来做这件事。他们不是为此而设计的。如果您必须使用ASMX,那么让ASMX将数据传递给Windows服务,该服务将在后台执行实际

我有几个web服务:asmx、wcf。在这两种方法中,有一些方法需要花费大量的时间进行处理,但这些方法的输入数据量很小,并且在导线上传输不需要太多时间。我想移动到不同步模型。客户端将数据传递给服务,服务回答数据传输是正确的,并在后台线程中处理数据,而不与客户端连接。因此,agter传输连接应关闭。可能吗?你能帮我写文章吗,或者可能只是谷歌的请求。

不要用ASMX web服务来做这件事。他们不是为此而设计的。如果您必须使用ASMX,那么让ASMX将数据传递给Windows服务,该服务将在后台执行实际工作


这在WCF中更为实用。

John是对的-一旦您关闭http连接,它就完成了。你不能回到同样的过程

因此,如果您可以使用另一种允许在一个连接上使用双工的技术(例如WCF),请这样做

但是,

如果您别无选择,只能使用Web服务, 这里有三种方法可以让它发挥作用。其中任何一个都可能超时

备选案文1: 忘记“客户端应答数据是正确的”部分。只需让每个线程发出请求并等待数据

备选案文2: 现在,假设这不起作用,您必须进行验证,这种方式需要客户端发出2个请求

第一个请求:返回有效/无效。 第二个请求:返回长期运行的结果

备选方案2的变化: 如果出现超时问题,可以让第一个请求生成GUID或唯一的数据库密钥,然后启动另一个进程,将此密钥传递给它,然后将密钥返回给客户端。(如果你能让服务器允许你启动一个进程-取决于安全设置/需要-如果不能,你可能能够启动一个异步线程,并在WebVC结束后让它继续运行?)进程将完成一个长任务,完成后用唯一id更新数据库中的行,显示结果和一个“完成”标志。客户端的第二个请求总是可以立即返回,如果处理未完成,则返回该请求,如果处理完成,则返回结果。客户端将每隔5秒左右重复此操作,直到完成


黑客,我知道,但我们并不总是可以选择我们使用的技术。

我们一直在写东西与英国政府网站互动,他们处理类似事情的方式是,你将你的请求和数据发送到服务器,服务器会大致回复说,“非常感谢-我们现在正在处理它,请稍后使用此id回电”-所有这些都在一条XML消息中。然后,在稍后的某个时候,您向服务发送一个新的http请求,本质上说,“我正在询问此特定请求id的状态“服务器返回一个结果,表明它已处理正常,或处理有错误,或仍在处理,请在xx秒后重试。
与前面描述的选项2类似。
这是一个轮询解决方案,而不是回调或双向对话,但它似乎可以工作


服务器需要为每个请求状态保留或访问某种形式的持久表或日志-它可以包含id、原始请求、工作流的当前阶段、到目前为止的任何错误消息、结果(如果有)如前所述,web服务可能已将大部分请求传递给单独的Windows服务。

当您说“web服务”时,我想您是指“ASMX web服务”?WCF也是“网络服务”。尤其是使用http发送东西。虽然可能通过发送一点数据,然后再发送更多数据来破解http的意图,但这需要大量的手工操作。我想你必须设置WCF来与http之外的东西进行通信?如果服务在同一台计算机上,那么是套接字还是命名管道?我不知道这里的WCF提供商的名字,但举例来说,你可以保持连接,只需与服务器聊天。不知道使用WCF做这件事的后果是什么,我仍然被困在那里的00。。。