我如何解决:Ajax WebService调用中会话超时后的InvalidOperationException

时间:2008-12-15 06:48:37

标签: javascript web-services exception session asp.net-ajax

我们从客户端调用Asp.Net ajax Web服务。所以JavaScript函数有如下调用:

//更改服务器端状态对象并为案例树设置所选节点的功能。

function JSMethod(caseId, url)
{  
    Sample.XYZ.Method(param1, param2, OnMethodReturn);  
}

function OnMethodReturn(result)
{
   var sessionExpiry = CheckForSessionExpiry(result);
   var error = CheckForErrors(result);

   ... process result
}

在“.asmx.cs”文件的服务器端: namespace Sample

[ScriptService]
class XYZ : WebService
{
       [WebMethod(EnableSession = true)]
        public string Method(string param1, string param2)
        {
            if (SessionExpired())
            {
                return sessionExpiredMessage;
            }
            .
            .
            .
        }
}

网站设置为使用基于表单的身份验证。现在,如果会话已过期,然后调用JavaScript函数“JSMethod”, 然后获得以下错误: Microsoft JScript运行时错误:Sys.Net.WebServiceFailedException:服务器方法“方法”失败,并显示以下错误:System.InvalidOperationException--身份验证失败。

此异常由文件“ScriptResource.axd”中的方法“function Sys $ Net $ WebServiceProxy $ invoke”引发:

function Sys$Net$WebServiceProxy$invoke
{

             .
             .
             .
               {
                    // In debug mode, if no error was registered, display some trace information
                    var error;
                    if (result && errorObj) {
                        // If we got a result, we're likely dealing with an error in the method itself
                        error = result.get_exceptionType() + "-- " + result.get_message();
                    }
                    else {
                        // Otherwise, it's probably a 'top-level' error, in which case we dump the
                        // whole response in the trace
                        error = response.get_responseData();
                    }
                    // DevDiv 89485: throw, not alert()
                    throw Sys.Net.WebServiceProxy._createFailedError(methodName, String.format(Sys.Res.webServiceFailed, methodName, error));
}

所以问题是即使在调用“Method”之前引发异常,在创建Web代理期间也会发生异常。有关如何解决此问题的任何想法

4 个答案:

答案 0 :(得分:0)

您有一个在WebMethod调用中指定的回调方法(OnMethodReturn),但不是错误处理程序方法。您需要创建一个并将其传递给回调方法。然后,您可以在那里处理失败的WebMethod调用。

答案 1 :(得分:0)

即使在Ajax框架可以调用目标方法之前,也会出现此问题,但在创建Web代理时它会失败。无论如何,我通过启用匿名访问Web Service文件夹并在Web服务方法中显式检查Session来解决问题

答案 2 :(得分:0)

为什么不在JS方法调用周围使用try { } catch { }

答案 3 :(得分:-1)

尝试这个...使用“静态”

[WebMethod(EnableSession = true)]
public static string Method(string param1, string param2)