gpt4 book ai didi

c# - 没有超时的异步 web 方法

转载 作者:太空狗 更新时间:2023-10-30 00:36:15 26 4
gpt4 key购买 nike

我需要一个控制台应用程序来调用 web 方法。

必须是异步的,没有超时(我们不知道这个方法处理任务需要多少时间。

这样好吗:

[WebMethod]
[SoapDocumentMethod(OneWay = true)]

??

最佳答案

如果您需要结果,请不要使用单向

首先,如果您需要方法的响应,您不需要 [SoapDocumentMethod(OneWay = true)]。此属性创建一个“即发即弃”调用,它从不向调用者返回响应并且必须返回 void。相反,使用常规方法调用并将其称为异步。

一种还是两种方法?

如果您使用的是 ASMX,则有两种基本解决方案:一种超时时间很长的方法,或两种方法(如@Aaronaught suggested above):一种启动操作并返回操作 ID,另一个传递 ID 并检索结果(如果可用)。

就我个人而言,在大多数情况下我不推荐这种两种方法的方法,因为它涉及到额外的复杂性,包括:

  • 需要更改客户端和服务器代码以支持两步调用
  • ASP.NET 内部对象,如 RequestResponsenot available when called from a background task launched with ThreadPool.QueueUserWorkItem.
  • 如果每个请求涉及多个线程,在繁忙的服务器上进行节流会变得更加困难。
  • 服务器必须保留结果,直到客户端拾取它们(或者您决定将它们丢弃),如果结果很大,这可能会占用 RAM。
  • 您不能将大的中间结果流式传输回客户端

是的,在某些情况下,2 法方法可以更好地扩展,并且对客户端和服务器之间断开的网络连接更有弹性。如果您需要在数小时后获取结果,则需要考虑这一点。但是你的操作只需要几分钟,你可以保证客户端将保持连接,考虑到 2-method 方法的额外开发复杂性,我认为它是最后的手段,只有在 one-method 解决方案没有的情况下才使用满足您的需求。

无论如何,解决方案需要两部分。首先,您需要从客户端异步调用该方法。其次,您需要延长客户端和服务器的超时时间。我在下面介绍了两者。

异步调用 ASMX Web 服务

要从命令行应用程序异步调用 ASMX 网络服务,请查看 this article从第 2 页开始。它展示了如何使用较新的 Event-Based Async Pattern 从 .NET cilent 应用程序异步调用 Web 服务.请注意,旧的 .NET 1.0 方法描述了 here ,它依赖于代理上的 BeginXXX/EndXXX 方法,不再推荐使用,因为 Visual Studio 的代理生成器不会创建这些方法。最好使用上面链接的基于事件的模式。

这是上面文章的摘录/改编,因此您可以了解所涉及的代码:

void KickOffAsyncWebServiceCall(object sender, EventArgs e)
{
HelloService service = new HelloService();
//Hookup async event handler
service.HelloWorldCompleted += new
HelloWorldCompletedEventHandler(this.HelloWorldCompleted);
service.HelloWorldAsync();
}

void HelloWorldCompleted(object sender,
HelloWorldCompletedEventArgs args)
{
//Display the return value
Console.WriteLine (args.Result);
}

延长服务器和客户端超时时间

为了防止超时,http://www.dotnetmonster.com/Uwe/Forum.aspx/asp-net-web-services/5202/Web-Method-TimeOut对如何调整客户端和服务器超时有一个很好的总结。如果您拥有服务器端方法或仅拥有客户端调用,您没有在问题中指定,因此下面的摘录涵盖了这两种情况:

there has two setttings that will affect the webservice call timeout behavior:

** The ASP.NET webservice's server-side httpruntime timeout setting, this is configured through the following element:

httpRuntime Element (ASP.NET Settings Schema)
http://msdn2.microsoft.com/en-us/library/e1f13641.aspx

<configuration> <system.web>
<httpRuntime .............
executionTimeout="45"
.............../> </system.web> </configuration>

Also, make sure that you've set the <compilation debug="false" /> so as to make the timeout work correctly.

** If you're using the wsdl.exe or VS IDE "add webreference" generated proxy to call webservice methods, there is also a timeout setting on the client proxy class(derived from SoapHttpClientProtocol class). This is the "Timeout" property derived from "WebClientProtocol" class:

WebClientProtocol.Timeout Property http://msdn2.microsoft.com/en-us/library/system.web.services.protocols.webclientprotocol.timeout.aspx

Therefore, you can consider adjusting these two values according to your application's scenario. Here is a former thread also mentioned this:

http://groups.google.com/group/microsoft.public.dotnet.framework.webservices/browse_thread/thread/73548848d0544bc9/bbf6737586ca3901

请注意,我强烈建议您将超时设置得足够长以涵盖您最长的操作(加上足够的缓冲区以确保在事情变慢时安全),但我不建议完全关闭超时。允许无限超时通常是不好的编程习惯,因为错误的客户端或服务器可以永久禁用另一个。相反,只需将超时设置得非常长 --- 并确保记录客户端或服务器超时的实例,这样您就可以在问题发生时检测和诊断问题!

最后,回应上面的评论:对于新代码,最好使用 WCF。但如果您无法使用 ASMX 网络服务,上述解决方案应该有效。

关于c# - 没有超时的异步 web 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com