我有一个.asmx web服务webmethod,我从jquery.ajax成功调用。 web方法运行正常。但是,它的执行速度非常慢。
该方法本身现在做的很少。我添加了CacheDuration = 120.这没有帮助。我真正关心的是实际调用该方法需要多长时间。当运行本地网站并在Webmethod的第一行使用断点启动VS2008调试器时,甚至到达第一行需要将近5秒钟。然后在调试器中继续按下,响应立即发生。所以web方法似乎并不是那么缓慢的“事情”。
有没有人经历过类似的行为?我需要设置一些东西来更快地调用webservice /方法吗?
代码:
[WebService(Namespace = "http://intranet/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class DocumentService : System.Web.Services.WebService
{
[System.Web.Script.Services.ScriptMethod(ResponseFormat = ResponseFormat.Json)]
[System.Web.Services.WebMethod(EnableSession = true, CacheDuration = 120)]
public Tree[] GetDocumentTree(string root)
{........
答案 0 :(得分:1)
确保您的问题不仅仅是JIT或加载时间。在第一次调用时,webservice必须编译和加载可能很昂贵的程序集。如果以后的呼叫中问题仍然存在,请检查您的代理设置。
我们遇到了同样的问题。我们的延迟比你的延迟要大得多(每次通话2分钟)。我们从作为域用户运行的Windows服务中调用Web服务。该用户帐户显然已启用其代理设置。因此,对于本地Web服务的每个HttpRequest,支持ServicePoint都试图从不存在的代理服务器获取wpad.dat文件。那个电话需要20秒才能超时。更糟糕的是,在.net库中获取代理的代码存在全局锁定。所以调用堆栈等待Web超时。进行调用的服务是我们的队列进程,它处理我们所有的异步行为。所以整个系统都备份了。
如果您想查看代码,请查看Reflector中的System.Net.AutoWebProxyScriptEngine.GetProxies。
由于我没有相关用户帐户的权限,我今天通过添加修复了我们的问题 到app.config文件。
如果要使用ajax调用您的方法,则必须正确使用浏览器设置。尝试在Connections \ Lan设置中禁用自动检测设置。我发现问题后,我在网上看了一下,显然IE6在启用此设置时会出现延迟问题。如果您有代理服务器,则在同一对话框中手动输入服务器地址。
答案 1 :(得分:0)
您可以使用Fiddler或FireBug来确定缓慢的部分。确保在计时之前已经点击了webservice一次以进行编译。
答案 2 :(得分:0)
在服务器端也使用JetBrains dotTrace。一旦我这样做,并发现某个.asmx页面需要很长时间才能加载,因为变量在其构造函数中被初始化。 (特别是Web服务引用需要很长时间才能构建。)