- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要一个控制台应用程序来调用 web 方法。
必须是异步的,没有超时(我们不知道这个方法处理任务需要多少时间。
这样好吗:
[WebMethod]
[SoapDocumentMethod(OneWay = true)]
??
最佳答案
如果您需要结果,请不要使用单向
首先,如果您需要方法的响应,您不需要 [SoapDocumentMethod(OneWay = true)]
。此属性创建一个“即发即弃”调用,它从不向调用者返回响应并且必须返回 void
。相反,使用常规方法调用并将其称为异步。
一种还是两种方法?
如果您使用的是 ASMX,则有两种基本解决方案:一种超时时间很长的方法,或两种方法(如@Aaronaught suggested above):一种启动操作并返回操作 ID,另一个传递 ID 并检索结果(如果可用)。
就我个人而言,在大多数情况下我不推荐这种两种方法的方法,因为它涉及到额外的复杂性,包括:
Request
和 Response
是 not available when called from a background task launched with ThreadPool.QueueUserWorkItem
. 是的,在某些情况下,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:
请注意,我强烈建议您将超时设置得足够长以涵盖您最长的操作(加上足够的缓冲区以确保在事情变慢时安全),但我不建议完全关闭超时。允许无限超时通常是不好的编程习惯,因为错误的客户端或服务器可以永久禁用另一个。相反,只需将超时设置得非常长 --- 并确保记录客户端或服务器超时的实例,这样您就可以在问题发生时检测和诊断问题!
最后,回应上面的评论:对于新代码,最好使用 WCF。但如果您无法使用 ASMX 网络服务,上述解决方案应该有效。
关于c# - 没有超时的异步 web 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2454377/
我想了解 Ruby 方法 methods() 是如何工作的。 我尝试使用“ruby 方法”在 Google 上搜索,但这不是我需要的。 我也看过 ruby-doc.org,但我没有找到这种方法。
Test 方法 对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。 object.Test(string) 参数 object 必选项。总是一个
Replace 方法 替换在正则表达式查找中找到的文本。 object.Replace(string1, string2) 参数 object 必选项。总是一个 RegExp 对象的名称。
Raise 方法 生成运行时错误 object.Raise(number, source, description, helpfile, helpcontext) 参数 object 应为
Execute 方法 对指定的字符串执行正则表达式搜索。 object.Execute(string) 参数 object 必选项。总是一个 RegExp 对象的名称。 string
Clear 方法 清除 Err 对象的所有属性设置。 object.Clear object 应为 Err 对象的名称。 说明 在错误处理后,使用 Clear 显式地清除 Err 对象。此
CopyFile 方法 将一个或多个文件从某位置复制到另一位置。 object.CopyFile source, destination[, overwrite] 参数 object 必选
Copy 方法 将指定的文件或文件夹从某位置复制到另一位置。 object.Copy destination[, overwrite] 参数 object 必选项。应为 File 或 F
Close 方法 关闭打开的 TextStream 文件。 object.Close object 应为 TextStream 对象的名称。 说明 下面例子举例说明如何使用 Close 方
BuildPath 方法 向现有路径后添加名称。 object.BuildPath(path, name) 参数 object 必选项。应为 FileSystemObject 对象的名称
GetFolder 方法 返回与指定的路径中某文件夹相应的 Folder 对象。 object.GetFolder(folderspec) 参数 object 必选项。应为 FileSy
GetFileName 方法 返回指定路径(不是指定驱动器路径部分)的最后一个文件或文件夹。 object.GetFileName(pathspec) 参数 object 必选项。应为
GetFile 方法 返回与指定路径中某文件相应的 File 对象。 object.GetFile(filespec) 参数 object 必选项。应为 FileSystemObject
GetExtensionName 方法 返回字符串,该字符串包含路径最后一个组成部分的扩展名。 object.GetExtensionName(path) 参数 object 必选项。应
GetDriveName 方法 返回包含指定路径中驱动器名的字符串。 object.GetDriveName(path) 参数 object 必选项。应为 FileSystemObjec
GetDrive 方法 返回与指定的路径中驱动器相对应的 Drive 对象。 object.GetDrive drivespec 参数 object 必选项。应为 FileSystemO
GetBaseName 方法 返回字符串,其中包含文件的基本名 (不带扩展名), 或者提供的路径说明中的文件夹。 object.GetBaseName(path) 参数 object 必
GetAbsolutePathName 方法 从提供的指定路径中返回完整且含义明确的路径。 object.GetAbsolutePathName(pathspec) 参数 object
FolderExists 方法 如果指定的文件夹存在,则返回 True;否则返回 False。 object.FolderExists(folderspec) 参数 object 必选项
FileExists 方法 如果指定的文件存在返回 True;否则返回 False。 object.FileExists(filespec) 参数 object 必选项。应为 FileS
我是一名优秀的程序员,十分优秀!