如何在ASP.Net中以“fire and forget”的方式调用Web服务

4

我有一个 Web 服务,希望从我的 asp.net 类中调用。我可以成功地调用我的 Web 服务。但现在我需要异步调用此服务。我需要调用它并且不等待服务完成执行。我不需要处理来自服务的响应,也不需要验证服务是否成功执行。我只想能够调用服务并自由地做其他事情。


2
你没有展示 PerformTaskAsync() 的代码。你确定它确实是异步执行的吗? - Robert Harvey
还要注意的是,您正在使用 using 块包装调用 PerformTaskAsync() 的对象,这似乎有问题。您要么在任务完成之前离开 using 块的作用域,要么等待任务完成后再离开 using 块的作用域,两者都不可取。您是否考虑过将整个操作分离成自己的线程,或使用 BackgroundWorker?或者使用 async await - Robert Harvey
1
如果您正在尝试在ASP.NET服务器上运行此代码,则可能需要启动Windows服务或某些类似的机制,以将其与您尝试在其中运行代码的ASP.NET线程解耦。请参见https://dev59.com/23LYa4cB1Zd3GeqPUzfM和http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/。 - Robert Harvey
1
你看过 IsOneWay=true 吗?http://msdn.microsoft.com/zh-cn/library/system.servicemodel.operationcontractattribute.isoneway(v=vs.110).aspx - Tim
@Tim:哇,原来就是这个问题。请添加你的答案。 - Administrateur
显示剩余7条评论
3个回答

4

您需要异步调用Web服务。 请前往并检查。

AddServiceReference -> Advance -> generate asynchronous operations.

在这个异步回调后,每个方法都会为你提供事件。假设你的服务中有ABC方法,当你同步消耗它时,这些方法将在你的应用程序中可用。

1>ABC (fire and wait for output)
2>ABCAsync(fire and forget)
3>ABC callback event(get fired <if ABCAsync is called> when data available in your application)

已经完成了。标题已经修改过了。我正在寻找使用Web服务实现“fire/forget”场景的方法。 - Administrateur

3

实现"发射并忘记"方法的一种方式是使用在OperationContract属性上使用IsOneWay属性,如下所示:

[OperationContract(IsOneWay=true)]
public void SomeMethod(string someValue);

当设置为true时,操作不会返回消息。请注意,标记为单向的方法不能具有返回类型或ref或out参数(这是有道理的)。它也不应与异步调用混淆,因为它不是同一件事情(事实上,如果需要较长时间才能建立连接,单向调用可以在客户端上阻塞)。
有关更多信息,请参见OperationContractAttribute.IsOneWay Property

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接