• 主页
  • ASP
  • .NET Framework
  • Web Services
  • VB
  • VC
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • LINQ

ajax调用将服务端自定义异常反馈到网页提示,本地测试正常,上传阿里云服务器后却是服务器内部异常(500码),这是怎么回事?

圣殿骑士18 2018-03-28 10:07:14
ajax调用将服务端自定义异常反馈到网页提示,本地测试正常,上传阿里云服务器后却是服务器内部异常(500码)。
我的异常处理机制是这样:
我在程序中的错误,全部是使用异常机制,而不是方法的返回值。然后在异常独立特性中处理。
本地IIS调试完全正常,发布到服务器发现不行,经过调试仍然找不到原因。

代码过程:
1、抛出异常的代码:

......
//扣减充值记录
var payList = GetRemainAmount(context, wxUser.MemberId);
payList = payList.OrderBy(c => c.PayId).ToList();
var sum = payList.Sum(c => c.Amount - c.UsedAmount);
if (info.Price > sum) throw new ShowErrorException("充值余额不足以支付!");


2、mvc异常处理特性:
public class MvcHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
base.OnException(context);
context.ExceptionHandled = true;
ResultType resultType = ResultType.error;
string showMessage = string.Empty;
string errorMessage = string.Empty;

//设置异常类型(影响客户端提示的图标)
if (context.Exception is ShowInfoException)
{
resultType = ResultType.info;
}
else if (context.Exception is ShowWarningException)
{
resultType = ResultType.warning;
}

//异常消息处理
if (context.Exception is ShowException)
{
//代码执行会进入这里:显示类异常:在客户端提示
showMessage = context.Exception.Message;
}
else
{
//其他类Exception:优化并记录日志,和本问题无关,代码不进入此处
......
}

context.HttpContext.Response.StatusCode = 200; //发现问题后期补救的措施,想将500错误改为200,无效果
context.Result = new ContentResult { Content = new AjaxResult { state = resultType.ToString(), message = showMessage }.ToJson() };
}
}


3、网页端:
$.confirm({
title: '',
text: '是否确定支付'+price+"个xx币以查看联系方式?",
onOK: function () {
$.ajaxEx({
url: "/Info/Item/PayAndView",
type: "post",
param: { id: infoId },
success: function (data) {
self.infoForm.Person(data.Person);
self.infoForm.Phone(data.Phone);
self.infoForm.AmountTag(data.AmountTag);
self.enablePayBtn(false);
}
});
}
});

其中,ajaxEx,只做了简单封装:
$.ajaxEx = function (options) {
var defaults = {
url: "",
param: [],
type: "get",
async: false,
beforeSend: null,
complete: null
};
var options = $.extend(defaults, options);
if (options.url == "") return;
if (options.type == "post") {
if ($('[name=__RequestVerificationToken]').length > 0) {
options.param["__RequestVerificationToken"] = $('[name=__RequestVerificationToken]').val();
}
}
$.ajax({
url: options.url,
data: options.param,
type: options.type,
dataType: "json",
async: options.async,
success: function (data) {
if (!data.state) { //返回的是Json格式结果集,一般是get操作
if (options.success) options.success(data);
} else { //返回AjaxResult格式的json状态数据,一般是post操作
if (data.state == "success") {
if (options.success) options.success(data);
} else {
$.alert(data.message, "错误");
}
}
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$.alert(errorThrown, "错误");
},
beforeSend: function () {
if (options.beforeSend) options.beforeSend();
},
complete: function () {
if (options.complete) options.complete();
}
});
}


百度过,有人说是文件夹权限问题,但我的情况是只是抛出一个异常,完全没有涉及文件操作。
请高手指教。

...全文
742 点赞 收藏 11
写回复
11 条回复
圣殿骑士18 2018年03月28日
换句话说,我认为如果服务端出现过异常,也只能是框架层的异常,即因为 我抛出的异常的不合适的处理代码,导致mvc框架本身又抛出了新异常,这些框架本身的异常,因为不是我们的业务代码,是框架代码,所以我称之为“顶级”异常。这种异常能够捕获的话,对调试会带来较大的便利。 但就这个问题本身,服务端有没有抛出框架异常,我是持怀疑态度的,我认为更可能的是:服务端并没有异常,而是ajax解析服务端返回的时候,捕获到了服务端没有覆盖掉的500错误,所以导致误判。 而为什么MvcHandleErrorAttribute 会抛出500编码呢,就是因为MvcHandleErrorAttribute 是 ErrorAttribute,本身就是处理异常的,因为是异常所以默认的statuscode就是500。
回复 点赞
圣殿骑士18 2018年03月28日
引用 5 楼 sp1234 的回复:
在服务器端需要写日志,起码能看到行号。
这个问题确实是给我造成了一些问题,因为常规的日志记录,起不了作用。我在MvcHandleErrorAttribute 中是有log4net日志的。但服务端应该没有发生错误,或者说如果发生了错误,也是在MvcHandleErrorAttribute 之外。所以如果有的话,所谓这种“顶级”异常,如何记录日志,是有必要考虑的,就先WinForm中的Application.ThreadException += Application_ThreadException;
回复 点赞
以专业开发人员为伍 2018年03月28日
要把 Exception.ToString 写到日志里边。例如

#if DEBUG
    Execute();
#else
try
{
    Execute();
}
Catch(Exception ex)
{
    记录日志("这个功能.log", DateTime.Now, ex.ToString());
    throw;
}
#endif
在 Debug 版本,不 try...cath。在 Release版本中,记录日志(里边有详细的堆栈信息、行号),然后再继续抛出异常。
回复 点赞
圣殿骑士18 2018年03月28日
引用 3 楼 peng2739956 的回复:
楼主 最近问题特多啊,这是换新的公司 还是开了新项目
原来有问题都是我自己解决,一些不影响开发的疑问也不太关注。后来我突然觉得发到csdn上来,也是个不错的办法,所以近期有一些以前累积的疑问发了出来。也有一些开发中的问题,我自己研究的同时,也发上来让专家们看看,集思广益也是有好处的。
回复 点赞
圣殿骑士18 2018年03月28日
引用 4 楼 sp1234 的回复:
出现 5xx 错误,就要首先搞清楚具体是哪一条语句出错。如果出错行号不清楚,就容易一直纠缠这错误理解的问题。
就这个问题,出错是怎么导致的是清楚的,因为出错就是我主动抛出的异常。
回复 点赞
以专业开发人员为伍 2018年03月28日
在服务器端需要写日志,起码能看到行号。
回复 点赞
以专业开发人员为伍 2018年03月28日
出现 5xx 错误,就要首先搞清楚具体是哪一条语句出错。如果出错行号不清楚,就容易一直纠缠这错误理解的问题。
回复 点赞
peng2739956 2018年03月28日
楼主 最近问题特多啊,这是换新的公司 还是开了新项目
回复 点赞
圣殿骑士18 2018年03月28日
问题已经找到了,如下这句话,确实起了作用,可能是我忘了发布最新的代码了?反正后来我又发布了一次,就好了,然后我去除了这句话,错误又回来了,由此验证就是这句代码起的作用。
context.HttpContext.Response.StatusCode = 200;        //发现问题后期补救的措施,想将500错误改为200,无效果
回复 点赞
guanyelong 2018年03月28日
你发布的网站 是 根目录下的子目录吗?如果是这样你的考虑web.config中连接数据库的<connectionStrings>节点跟父节点有重复的name需删掉
回复 点赞
发动态
发帖子
.NET技术社区
创建于2007-09-28

4.9w+

社区成员

66.8w+

社区内容

.NET技术交流专区
社区公告
暂无公告