首页 > 解决方案 > 调试长时间运行的 Web 服务调用

问题描述

我正在使用 C# 连接到 Web 服务以获取数据。但是,我目前无法让代码在远程服务器上运行;当我说问题时,我的意思是它正在运行,但是客户端和服务器之间的连接速度非常慢(这不是我的错 - 客户端通过 web 服务提供了一个缓慢的结果集,并且他们已经按顺序关闭了所有超时这样做。)

 if ((endpointConfiguration == EndpointConfiguration.SFFService))
            {
                System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
                result.MaxBufferSize = int.MaxValue;
                result.ReaderQuotas = System.Xml.XmlDictionaryReaderQuotas.Max;
                result.MaxReceivedMessageSize = int.MaxValue;
                result.AllowCookies = true;
                result.OpenTimeout = TimeSpan.MaxValue;
                result.CloseTimeout = TimeSpan.MaxValue;
                result.SendTimeout = TimeSpan.MaxValue;
                return result;
            }

所以。不是一个好的开始。打开关闭并发送所有设置为最大值。

无论如何,我已经匹配了他们的长时间超时,并且一些较小的 Web 服务请求在服务器上完成并成功。然而,最大、最慢的只是无限期地挂起,可能是因为我告诉它永远不会超时。

但是,我很确定还有其他问题发生,因为我把它放在了一夜之间,它就坐在那里。在本地,在我的开发机器上,虽然速度很慢,但它可以工作。

我的问题是,有没有人知道额外的事情来检查可能在这里发挥作用的环境?我想也许是防火墙,但鉴于小请求成功(并连接),调试慢速请求非常困难,因为我不知道要等多长时间才能接受程序不会做任何事情。

FWIW我尝试通过浏览器进行连接,再次,浏览器只是坐在那里等待请求完成,而它永远不会这样做(很可能是由于服务器上关闭了超时)。如果有任何方法可以查看还有多少请求需要完成(例如下载百分比),这可能会帮助我了解代码是否正在执行除等待之外的任何操作。

标签: c#.netweb-servicesdebugging

解决方案


即使您附加到远程进程,也无法获得远程调用的进度。尝试在服务器机器上使用本地 Visual Studio(最好在非生产 VM 上)并附加到本地进程,而不是使用远程调试器。

我不确定问题到底是什么,但我在调试慢速应用程序时采取的第一步是测试本地连接(本地客户端和本地服务器)以从等式中消除网络。如果效果很好,请尝试将服务器托管在不同的地方(可能是公共云?)并在那里再试一次,如果效果很好,那么肯定有东西在途中或在该服务器上。

如果您有兴趣跟踪 Web 服务调用需要多长时间,您可以通过将开始时间放入 Global.asax 中 BeginRequest/EndRequest 上的 HttpContext.Current.Items 或 OperationContext.Current.Items 中来跟踪它,或者如果您使用 MessageInspector 来跟踪它WCF(您可以通过将日期时间返回到 Before 方法并从 After 方法中的 corelationState 参数中读取它来发送两个方法之间的日期时间)。


推荐阅读