我必须从WebMethod
重定向,我知道我不能。所以我只是尝试将页面url作为字符串返回,并将在success
回调中重定向。
问题是我在重定向之前有大量的代码,并且是用一个集中式方法编写的(只有在重定向之前调用的方法才能执行相同的操作。)在我的重定向中,我也必须调用该函数。 / p>
我只是将我的代码放在这里而不需要调用集中式函数来更好地理解。
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string TestException()
{
try
{
System.Web.HttpContext.Current.Response.Redirect("Test.aspx");
return "No Exception";
}
catch(Exception ex)
{
return "Exception";
}
}
作为回应我收到Internal Server Error (505)
System.Threading.ThreadAbortException
而不是像catch块一样返回“Exception”。
其他例外不是这种情况,即如果我用{/ p>之类的东西替换Response.Redirect
int i = 0;
int j = 5/i;
它也会引发异常,但不会给我Internal Server Error (505)
,而是返回“Excetion”,即从catch块返回字符串。
我的问题是
System.Threading.ThreadAbortException
?Centralized
函数中使用的可选参数,通过检查附加参数我可以返回字符串而不是重定向但是我想知道是否有什么我可以使用在webmethod或任何其他地方,没有触及集中功能,以使其工作?答案 0 :(得分:1)
为什么它以不同方式处理System.Threading.ThreadAbortException 来自其他例外?
关于第一个问题,请访问MSDN上的ThreadAbortException:
ThreadAbortException是特殊例外,可以被捕获,但是它 将在catch块结束时再次自动引发。什么时候 引发此异常,运行时执行所有finally块 在结束线程之前。因为线程可以做无界限 在finally块中计算或调用Thread.ResetAbort来取消 中止,无法保证线程永远不会结束。如果你 想要等到中止的线程结束,你可以调用 Thread.Join方法。加入是一个阻止调用,直到没有返回 线程实际上停止执行。
我认为为了防止这种情况,你需要在catch块中调用Thread.ResetAbort()
。
[WebMethod]
[ScriptMethod(UseHttpGet = true)]
public static string TestException()
{
try
{
System.Web.HttpContext.Current.Response.Redirect("Test.aspx");
return "No Exception";
}
catch(ThreadAbortException ex)
{
Thread.ResetAbort();
return "Exception";
}
}
在WEB METHOD
中使用Response.Redirect不是一个好习惯!当您使用WEB METHOD
时,您应该遵循SOAP
规则。您需要知道致电Response.Redirect
会致电Response.End
。
HttpResponse.Redirect Method页:
绝对网址(例如,http://www.contoso.com/default.aspx)或 可以为。指定相对URL(例如,default.aspx) 目标位置,但某些浏览器可能会拒绝相对URL。的重定向强> 调用End引发ThreadAbortException异常 完成。