前端ajax请求后,后台出错返回错误data的数据,展示返回错误的message。
跟剧请求头,如果是ajax的请求,返回一个json的object的回去,属性中会有isSuccess,与MessageInfo 等字段,根据是否是exception,会在controller实现重写OnExcetion
方法,但是默认情况下IIS中 .net中会是error remote only.所以在本地server测试的时候,返回的json数据,请求头都是200,但是在remote情况下,就是返回500错误的状态码,所以导出返回的json data 数据类型有些变化,这里就导致了同一份代码,在本地是working的但是部署到服务器里 从外面访问时候就到吃data转化问题拿不到值得错误。
angular js代码 设置请求头参数
options: RequestOptions;
constructor(private http: Http) {
let headers = new Headers();
headers.append('X-Requested-With', 'XMLHttpRequest');
this.options = new RequestOptions({ headers: headers });
c#代码 如果直接在filtercontext.response.statusCode中直接把设置为200也可以避免这个问题。
protected override void OnException(ExceptionContext filterContext)
{
if (filterContext.RequestContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = 200;
var ajaxResultModel = new AjaxResultModel();
ajaxResultModel.Message = filterContext.Exception.Message;
ExceptionInfo exceptionInfo = new ExceptionInfo(filterContext.Exception);
Logger.WriteException(filterContext.Exception);
//ajaxResultModel.ExceptionInfo = exceptionInfo;
ajaxResultModel.Code = Accelerator.Common.Constants.AjaxStatusCode.Failed;
ajaxResultModel.IsSuccess = false;
ajaxResultModel.MessageInfo = filterContext.Exception.Message;
filterContext.Result = Json(new { data = ajaxResultModel }, JsonRequestBehavior.AllowGet);//new JsonResult { Data = ajaxResultModel, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
else
{
if (filterContext.Exception is SessionException)
{
如果错误的默认配置下,会返回有异常的json, 真正的数据是放在responseText里面,正确的是直接在data里面。
当然我们可以用下面的ajax代码,无论是有异常还是正常的都可以拿到返回的data。 因为数据类型里会有文件类型,所以contentType属性用false,
multipart/form-data; boundary=----WebKitFormBoundaryFrcoSUcr7uLoU1SX从请求头中可以看到生成的请求数据类型是这个。
$.ajax({
url: './LeaveInfo/SaveAbRequest',
data: formData,
type: 'POST',
contentType: false,
processData: false,
dataType: 'json',
async: false,
cache: false
//success: function (data: any, textStatus: any) {
// if (data.data.IsSuccess) {
// messageFlag = "success";
// } else {
// messageFlag = "failure";
// errorMessage = data.data.MessageInfo;
// }
//}
//error: function (err: any) {
// messageFlag = "failure";
//}
}).always(function (jqXHR: any, textStatus: any, errorThrown: any) {
var data = (jqXHR.responseJSON || jqXHR).data;
//alert(JSON.stringify(jqXHR));
if (data.IsSuccess) {
messageFlag = "success";
} else {
messageFlag = "failure";
errorMessage = data.MessageInfo;
}
//$("div[class='loading-mask']").hide();
});