用vs2017創建一個ASP.NET Core Web應用程序並選擇MVC框架,自動生成了 Startup的類,並配置了錯誤處理方式:html
if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); }
簡單講:ajax
而在實際開發和生產過程當中,咱們須要:app
以下面的代碼:框架
Action: public IActionResult Edit(int id = 0) { if (id == 0) //模擬用戶不能修改該Id的內容 return NotFound("沒有操做權限"); if (id == 1) //模擬發生異常了 throw new Exception("錯誤:error desc"); return View(); } /// <summary> /// ajax調用 /// </summary> /// <param name="id"></param> /// <returns></returns> [HttpPost] public IActionResult Save(int id = 0) { if (id == 0) //模擬用戶不能修改該Id的內容 return NotFound("沒有操做權限"); if (id == 1) //模擬發生異常了 throw new Exception("錯誤:error desc"); return Content(id + DateTime.Now.ToString()); } View(Edit.cshtml) <div class="text-center"> id: <input type="text" id="TId" /> <input type="button" value="Save" id="BSave" /> <span id="SResult"></span> </div> @section scripts { <script> $(function () { $("#BSave").click(function () { $.ajax({ type: "post", url: "@Url.Action("Save")", data: { id: $("#TId").val() }, success: function (ret) { $("#SResult").html(ret); }, error: function (XMLHttpRequest) { if (XMLHttpRequest.responseText != "") { alert(XMLHttpRequest.responseText); } else alert(XMLHttpRequest.status ); } }); }); }); </script> }
好,咱們須要保存錯誤信息,並更友好的提示ajax調用錯誤。post
1.添加一個類url
public class FilterException : IExceptionFilter { private readonly YKDbContext db; private readonly IHostingEnvironment _Env; public FilterException(YKDbContext dbContext, IHostingEnvironment env) { db = dbContext; _Env = env; } public void OnException(ExceptionContext context) { if (_Env.IsDevelopment()) { if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest") { context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; string msg = context.Exception.Message; Exception ex = context.Exception; while (ex.InnerException != null) { ex = ex.InnerException; msg += ex.Message; } context.Result = new JsonResult(msg); context.ExceptionHandled = true; // 代表異常已處理,客戶端可獲得正常返回 } } else { string msg = context.Exception.Message; Exception ex = context.Exception; while (ex.InnerException != null) { ex = ex.InnerException; msg += ex.Message; } //存入db if (context.HttpContext.Request.Headers["x-requested-with"] == "XMLHttpRequest") { context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError; context.Result = new JsonResult("出錯了!已經將錯誤信息發送給開發人員,開發人員將盡快處理。"); context.ExceptionHandled = true; } } } }
2.配置服務
在類Startup
的方法ConfigureServices
中修改spa
services.AddMvc(options => { options.Filters.Add<FilterException>(); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
依然按##Ctrl+F5##運行:
3d
是咱們想要的結果吧?!code
附:Filter裏面如何判斷Controller
是否有ApiController
屬性htm
bool isApi = context.Filters.Any(ii => ii.GetType().Name == "ApiControllerAttribute");