[英]ASP.NET send exception message
我正在開發Web應用程序,這是我處理異常的方法:
void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
LogManager.GetCurrentClassLogger().Error(ex);
Response.Clear();
Server.ClearError();
HttpException httpEx = ex as HttpException;
if (httpEx == null)
httpEx = new HttpException(400, ex.Message, ex);
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("action", "Handler");
routeData.Values.Add("exception", httpEx);
Response.TrySkipIisCustomErrors = true;
var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
var c = ControllerBuilder.Current.GetControllerFactory().CreateController(rc, "Error");
c.Execute(rc);
}
發生異常時(例如: throw new ArgumentException("Generator with given Id does not exist.");
),用戶將收到錯誤視圖,其中包含有關所發生事件的詳細信息。
問題是,錯誤消息沒有以HttpResponseMessage的形式(作為ReasonPhrase或其他任何形式)發送給用戶。
private async void DeleteGenerator(Guid id)
{
var response = await dataService.RemoveGenerator(id);
if ((int)response.StatusCode >= 300)
MessageBox.Show( /* Error message from response */ );
}
在這里,我應該收到帶有"Generator with given [...]"
框,但是我不知道如何實現這一點。 我試過這個 ,但“HttpError”缺失, 這可是我真的不知道如何將其落實到我的代碼(如何被發送的Application_Error實際HttpResponseMessage)和這個 ,但再次我不知道應該如何改變。
這是我的常規錯誤處理程序控制器:
public ActionResult Handler(HttpException exception)
{
Response.ContentType = "text/html";
if (exception != null)
{
Response.StatusCode = exception.GetHttpCode();
ViewBag.StatusString = (HttpStatusCode)exception.GetHttpCode();
return View("Handler", exception);
}
return View("Internal");
}
而且我已經出於測試目的嘗試了此操作,但它也無法正常工作(客戶端收到帶有“ Bad Request”作為ReasonPhrase
HttpResponseMessage
。
public HttpResponseMessage Handler(HttpException exception)
{
Response.ContentType = "text/html";
if (exception != null)
{
return new HttpResponseMessage
{
Content = new StringContent("[]", new UTF8Encoding(), "application/json"),
StatusCode = HttpStatusCode.NotFound,
ReasonPhrase = "TEST"
};
}
return null;
}
所以在我的Controller
,負責顯示錯誤觀點(這是創建,並在觸發Application_Error
方法),我已經添加了StatusDescription
進入Response
。 這不是理想的方法,它會覆蓋實際的StatusCode字符串,但是可以工作。
public class ErrorController : Controller
{
public ActionResult Handler(HttpException exception)
{
Response.ContentType = "text/html";
if (exception != null)
{
Response.StatusCode = exception.GetHttpCode();
Response.StatusDescription = exception.Message;
ViewBag.StatusString = (HttpStatusCode)exception.GetHttpCode();
return View("Handler", exception);
}
return View("Internal");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.