如果需要结果,请勿使用单向
首先,如果您需要方法的响应,您不需要[SoapDocumentMethod(OneWay = true)]。此属性创建一个“即发即弃”调用,它永远不会将响应返回给校准器,并且必须返回void。相反,使用常规方法调用并将其称为异步。
一种或两种方法?
如果您使用的是 ASMX,有两种基本解决方案:一种方法超时时间很长,或者两种方法(如 @Aaronaught suggested above):一种启动操作并返回操作 ID,另一个传递 ID 并检索结果(如果可用)。
就我个人而言,在大多数情况下我不会推荐这种两种方法的方法,因为这会带来额外的复杂性,包括:
确实,在某些情况下,2 方法方法可能会更好地扩展,并且对客户端和服务器之间断开的网络连接更具弹性。如果您需要在数小时后获取结果,则需要考虑这一点。但是你的操作只需要几分钟,你可以保证客户端将保持连接,考虑到 2 方法方法的额外开发复杂性,我认为只有在单一方法解决方案不使用时才使用它符合您的需求。
无论如何,解决方案需要两部分。首先,您需要从客户端异步调用该方法。其次,您需要延长客户端和服务器的超时时间。我在下面都介绍了。
异步调用 ASMX Web 服务
要从命令行应用程序异步调用 ASMX Web 服务,请查看从第 2 页开始的 this article。它展示了如何使用较新的 Event-Based Async Pattern 从 .NET 客户端应用程序异步调用 Web 服务.请注意,不再推荐使用 here 描述的旧 .NET 1.0 方法,它依赖于代理上的 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 很好地总结了如何调整客户端和服务器超时。您没有在问题中指定您是拥有服务器端方法还是仅拥有客户端调用,因此下面的摘录涵盖了这两种情况:
有两个设置
影响webservice调用超时
行为:
** ASP.NET webservice 的服务器端 httpruntime 超时
设置,这是通过配置
以下元素:
httpRuntime 元素(ASP.NET 设置架构)
http://msdn2.microsoft.com/en-us/library/e1f13641.aspx
executionTimeout="45"
....../> 配置>
另外,请确保您已设置
以便
使超时正常工作。
** 如果您使用生成的 wsdl.exe 或 VS IDE “添加 webreference”
调用网络服务方法的代理,
还有一个超时设置
客户端代理类(派生自
SoapHttpClientProtocol 类)。这是
派生自的“超时”属性
“WebClientProtocol”类:
WebClientProtocol.Timeout 属性http://msdn2.microsoft.com/en-us/library/system.web.services.protocols.webclientprotocol.timeout.aspx
因此,您可以考虑调整
这两个值根据您的
应用的场景。这里有一个
以前的帖子也提到了这一点:
http://groups.google.com/group/microsoft.public.dotnet.framework.webservices/browse_thread/thread/73548848d0544bc9/bbf6737586ca3901
请注意,我强烈建议您将超时设置为足够长以包含您最长的操作(加上足够的缓冲区以确保事情变慢时的安全),但我不建议完全关闭超时。允许无限超时通常是不好的编程习惯,因为错误的客户端或服务器可以永久禁用另一个。相反,只需将超时设置得很长 --- 并确保记录客户端或服务器超时的实例,以便在问题发生时检测和诊断问题!
最后,回应上面的评论:对于新代码,最好使用 WCF。但是,如果您在使用 ASMX Web 服务时遇到问题,上述解决方案应该可以工作。