對於JSON WebMethods並沒有相當於SoapExtension
,並且在您的生產站點中打開自定義錯誤將導致返回給客戶端的通用錯誤消息,在服務器上不會產生錯誤。你不能規避這一點。
如果您使用類似ILSpy的東西檢查代碼,則無法將方法或類傳遞到頁面WebMethods,如SoapExtension
。該錯誤被ASP.Net吞噬,因爲它會調用Web方法,您將得到的唯一通知是發送給客戶端的HTTP 500錯誤,並帶有一般性錯誤消息。
在4.0的WebMethods被調用本:
// System.Web.Script.Services.RestHandler
internal static void ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)
{
try
{
//snip irrelevant code
RestHandler.InvokeMethod(context, methodData, rawParams);
}
catch (Exception ex)
{
RestHandler.WriteExceptionJsonString(context, ex);
}
}
因此,如果調用你的方法拋出一個錯誤,它會調用與500的StatusCode下面的代碼,就沒有再扔在那裏,沒有別的你可以通過呼叫,除非我是盲目的,它只是默默吞下。即使你已經變得更糟自定義錯誤接通,這任何理智的人都會,它會完全模糊的成因:
// System.Web.Script.Services.RestHandler
internal static void WriteExceptionJsonString(HttpContext context, Exception ex, int statusCode)
{
//snip code setting up response
context.Response.TrySkipIisCustomErrors = true;
using (StreamWriter streamWriter = new StreamWriter(context.Response.OutputStream, new UTF8Encoding(false)))
{
if (ex is TargetInvocationException)
{
ex = ex.InnerException;
}
if (context.IsCustomErrorEnabled)
{
streamWriter.Write(JavaScriptSerializer.SerializeInternal(RestHandler.BuildWebServiceError(AtlasWeb.WebService_Error, string.Empty, string.Empty)));
}
else
{
streamWriter.Write(JavaScriptSerializer.SerializeInternal(RestHandler.BuildWebServiceError(ex.Message, ex.StackTrace, ex.GetType().FullName)));
}
streamWriter.Flush();
}
}
我無法看到它周圍的方式,看起來像的WebMethod還沒有準備好爲了生產代碼,恥辱。
您的問題是,您應該使用WCF時使用舊技術。 WCF比ASMX更具可擴展性。 – 2012-03-06 14:48:58
@JohnSaunders WCF很糟糕,在幾年內將會像死神一樣死去,它本身就是遺產。如果我可以使用任何我想用於MVC的東西,但是不能一夜之間重寫客戶端的傳統項目 – mattmanser 2012-03-06 14:54:32
異常處理程序只能捕獲異常。如果這些例外被隱藏,那麼沒有例外可以處理。 – 2012-03-07 09:50:56