.net 如何:Web服务和在Web服务中处理客户端超时?

.net 如何:Web服务和在Web服务中处理客户端超时?,.net,web-services,timeout,.net,Web Services,Timeout,我试图记录当客户端在Web服务调用中超时时发生的情况 看看下面的HelloWorld代码。这就是我想要做的,但它似乎不工作,因为它总是返回真的 [WebMethod] public string HelloWorld() { //.. Do the Webservice stuff if (!Context.Response.IsClientConnected) { //Log some vital info about this call that timed

我试图记录当客户端在Web服务调用中超时时发生的情况

看看下面的HelloWorld代码。这就是我想要做的,但它似乎不工作,因为它总是返回真的

[WebMethod]
public string HelloWorld() {
    //.. Do the Webservice stuff
    if (!Context.Response.IsClientConnected) {
        //Log some vital info about this call that timed out...
    }
    return "The WebService Result";
}
有人知道检查Web服务调用状态的其他方法吗


当客户端断开与Web服务调用的连接时,Web服务中不会抛出异常。代码继续运行,直到完成,然后将其结果返回为空(因为连接已关闭)。

我希望每个Web服务调用都是一个请求/响应。如果出现错误,例如服务不可用或超时,我希望抛出异常


那么,是否可以用try-catch来包围调用?

订阅某种事件比检查某个标志要好。基本上,ASP.NET正在终止请求,因为它花费的时间超过了配置的超时值(httpRuntime元素中的executionTimeout设置)。但是,我不太确定ASP.NET运行时是否有这样的事件。显然,它也没有提出任何例外。因此,在这种特殊情况下,您的服务和ASP.NET运行时之间似乎存在断开连接。我很想知道是否有办法/诀窍来实现你的目标

同时,您可以查看ASP.NET性能计数器。有一个叫做“请求超时”。它可能包括在队列中等待或在执行过程中超时的请求。您可以在web方法开始和结束时读取web服务的性能计数器。如果数字跳变,则表示请求刚好超时。这可能并不意味着跳转对应于该特定请求,但在任何情况下,您仍然可以记录一些信息,例如传递给web方法的参数、运行时间等,这些信息可能会有所帮助。您还可以在web.config中增加executionTimeout值,以便在您尝试优化web方法以在客户端需要即时解决方案时更快地运行时,有更多的时间

如果这是一个asmx web服务,您可能需要查看global.asax中的Session_End事件。当ASP.NET终止请求时,可能会调用它


只是一些想法。

这将取决于您正在使用的Web服务框架的细节。从你展示的情况来看,如果你没有检测到这一点的机制,我也不会感到惊讶

一般来说,Web服务甚至不需要使用HTTP之类的传输,您可以通过队列甚至电子邮件进行响应。一般来说,作为简单Web服务的服务器实现,您不能确保您的客户机已经看到了答案。如果你的测试成功了,你会怎么推断?在你做测试的那一刻,他就在那里,在你决定不登录一纳秒后,但在你回来之前,他已经走了。在简单的SOAP/HTTP中,客户端和服务器之间没有事务关系

有额外的Web服务标准来解决其中一些问题,但通常您需要在调用方可能看不到答案的假设下设计Web服务。(也许您还提供状态服务,这样客户就可以下车,然后回来问“您处理订单了吗”345)


请告诉我们您希望通过此日志记录实现什么,也许有人有设计方法可以提供帮助。

HTTP协议没有服务器如何ping客户端的规范。IsClientConnected的意义-检查是否存在一些“不满意”的查询以呈现HttpResponse。 如果客户端支持保持连接活动,则可能是(我不确定)


考虑一下拉式体系结构——您是否有单向方法,以及客户端的一些看门狗来定期检查方法是否完成。

我认为为了让iClientConnection返回false,web服务代码中的“/”部分。。“执行web服务”所需的时间必须比客户端的超时设置长。您可以通过将客户端的超时设置为60秒,并在IsClient Connect调用之前在web服务代码中添加Thread.Sleep(70000)来模拟此情况

但是,我不认为这会导致iClientConnection返回false。web服务请求超时和重置与服务器的连接是两个不同的问题。如果响应有一个名为iClientsTillWaiting的方法用于此web服务调用返回,这可能会满足您的需要


我认为,如果您在web服务方法仍在iClientConnection检查之前的部分中时物理断开客户端与网络的连接,则可以让iClientConnection返回false,但我猜这不是您想要的。

我不相信一般情况下会出现异常。即使该服务正在返回一个长响应,例如传出传输窗口关闭,等待能够发送字节时超时,所有这些都将在web方法返回ASP.NET后发生

您应该做的是了解哪些web方法花费的时间太长。您可以通过打开跟踪来开始此操作,如“”中所示。然后,您可能需要进一步分析服务以查看花费的时间


您还应该仔细查看事件日志,特别是从“ASP.NET”中查找警告事件“事件源。这些是从哪里来的。我建议您了解健康监测系统,因为您可能会发现它为您做了许多您必须自己编写的事情,只需以配置为代价。

我创建了一个简单的测试客户端,并将我的请求设置为100毫秒超时

        HttpWebRequest MakeRequest = (HttpWebRequest)WebRequest.Create("http://localhost:55959/ScanServer.asmx");
        if (MakeRequest == null)
        {
            throw new Exception();
        }
        HttpWebResponse PostResponse = null;

        MakeRequest.Method = "POST";
        MakeRequest.AuthenticationLevel = System.Net.Security.AuthenticationLevel.None;
        MakeRequest.UserAgent = "testing";
        MakeRequest.Timeout = 100;
        MakeRequest.ContentType = "application/soap+xml; charset=utf-8;";

        try
        {
            byte[] PostBytes = UTF8Encoding.UTF8.GetBytes(PostData);
            MakeRequest.ContentLength = PostBytes.Length;

            Stream RequestStream = MakeRequest.GetRequestStream();
            RequestStream.Write(PostBytes, 0, PostBytes.Length);

            PostResponse = (HttpWebResponse)MakeRequest.GetResponse();
        }
        catch
        {
            throw;
        }
在调试期间的SOAP WebService调用中,我等待一个断点,直到客户端收到超时异常。然后将
Context.Response.IsClientConnected
的值设置为false。我也用提琴来送信