.net mvc Angular2项目 ajax请求返回结果异常处理

前端使用Angular2进行Ajax请求时,遇到后台返回错误数据的情况。当控制器捕获异常并返回带有isSuccess和MessageInfo字段的JSON对象时,本地测试正常,但在远程服务器上,IIS会将状态码设为500。解决方法是在C#代码中过滤响应状态码或在Angular代码中统一处理数据获取,确保无论是否有异常都能正确解析返回的data。同时,注意contentType的设置,以适应multipart/form-data类型的请求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端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();
                });

          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值