0

我有一个从 jquery.ajax 成功调用的 .asmx web 服务 webmethod。网络方法运行正常。但是,它的执行速度非常慢。

该方法本身现在做的工作很少。我添加了 CacheDuration = 120。这没有帮助。我真正关心的是实际调用该方法需要多长时间。在本地运行网站并在 Web 方法的第一行使用断点启动 VS2008 调试器时,甚至需要将近 5 秒才能到达第一行。然后在调试器中点击继续,响应立即发生。所以 webmethod 似乎不是慢的“东西”。

有没有人经历过类似的行为?是否需要为 web 服务/方法设置一些东西才能更快地调用?

代码:

[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)
  {........
4

3 回答 3

1

确保您的问题不仅仅是 JIT 或加载时间。在第一次调用时,Web 服务必须编译和加载可能很昂贵的程序集。如果问题在以后的调用中仍然存在,请检查您的代理设置。

我们遇到了同样的问题。我们的延迟比你的要严重得多(每次通话总共 2 分钟)。我们从作为域用户运行的 Windows 服务内部调用 Web 服务。该用户帐户显然已打开其代理设置。因此,对于本地 Web 服务的每个 HttpRequest,支持 ServicePoint 都尝试从不存在的代理服务器获取 wpad.dat 文件。该呼叫需要 20 秒才能超时。更糟糕的是,在 .net 库中获取代理的代码周围存在全局锁定。所以调用堆栈等待网络超时。进行调用的服务是我们的队列进程,它处理我们所有的异步行为。所以整个系统都备份了。

如果您想查看代码,请查看 Reflector 中的 System.Net.AutoWebProxyScriptEngine.GetProxies。

由于我没有相关用户帐户的权限,我今天通过添加到 app.config 文件来解决我们的问题。

如果您的方法打算使用 ajax 调用,那么您必须正确设置浏览器。尝试在 Connections\Lan 设置中禁用自动检测设置。发现问题后,我在网上浏览了一下,显然 IE7 在此设置开启时会出现延迟问题。如果您确实有代理服务器,则在同一对话框中手动输入服务器地址。

于 2009-05-15T04:06:00.907 回答
0

您可以使用 Fiddler 或 FireBug 找出慢的部分。确保您已经访问过一次 Web 服务,以便在计时之前对其进行编译。

于 2009-04-29T21:37:06.377 回答
0

还要在服务器端使用 JetBrains dotTrace。一旦我这样做了,发现某个 .asmx 页面需要很长时间才能加载,因为在其构造函数中初始化了变量。(特别是 Web 服务引用需要很长时间来构建。)

于 2009-04-29T22:34:10.437 回答