jQuery 1.11.3 Post 收到错误请求但未失败
jQuery 1.11.3 Post receives Bad Request but does not go into fail
jQuery 1.11.3 Post 从 HttpResponseMessage 接收到 Bad Request 但没有进入失败状态。来自服务器的消息是以下字符串:
"StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content:
, Headers: { }"
我不应该从 HttpResponseMessage 返回一个对象,说 Bad Request 吗?我正在使用 IIS Express。
后端:
[HttpPost]
public HttpResponseMessage DeleteOrderRow(int orderRowId)
{
var row = OrderRowData.LoadItem(orderRowId);
if (row == null)
{
AddAlert(AlertStyles.Danger, "Order row does not exist");
//Below is the example being returned
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
OrderRowData.Delete(orderRowId);
AddAlert(AlertStyles.Success, "Order row has been removed");
return new HttpResponseMessage(HttpStatusCode.OK);
}
jQuery:
$(document).on('click', '.delete-order-row', function (event) {
event.preventDefault();
var element = $(this);
var id = element.data('id');
if (id == null || id === -1) {
element.closest('tr').remove();
} else {
var url = element.attr('href');
$.post(url, { orderRowId: id })
.done(function (data) {
element.closest('tr').remove();
})
.fail(function (xhr, status, error) {
location.reload();
});
}
});
更新: 在@smoksnes 提示后检查网络连接。服务器实际上发送 200 OK 即使 return new HttpResponseMessage(HttpStatusCode.BadRequest);
是从后端发送的。这是 IIS Express 的正常行为吗?
更新 2: 使用此代码在客户端解决。根据@smoksnes 的回复,IExceptionFilter
和 ExceptionFilterAttribute
不在我的项目中,我怀疑是 Umbraco。有没有其他人在 Umbraco 经历过这种情况?
.done(function (data) {
if (data.indexOf("StatusCode: 400") !== -1) {
$(window).scrollTop(0);
location.reload();
} else {
element.closest('tr').remove();
}
})
Is this normal behavior from IIS Express?
在空白项目中,这应该 return 400 Bad Request
。
public HttpResponseMessage DeleteOrderRow()
{
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
但是正如我在评论中提到的,根据网络选项卡中的信息,您似乎得到了 200 OK
。这就是导致您的客户端脚本输入 done()
的原因。这可能是由自定义过滤器引起的。
检查项目中的 IExceptionFilter
和 ExceptionFilterAttribute
。
一个常见的解决方案是在 Gobal.asax 中添加这些过滤器:
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); // Or whatever filter you got.
filters.Add(new AjaxExceptionLoggingFilter());
}
}
他们可以将响应更改为 200 OK
。
此外,根据 url,您似乎在使用 Umbraco。我对它不是很熟悉,但那里可能有一些魔法。如果服务器端无法解决,可以在客户端解决:
//Quick fix (dirty)
$.post(url, { orderRowId: id })
.done(function (data) {
if(data.StatusCode != 200)
{
// do error stuff..
return;
}
element.closest('tr').remove();
})
.fail(function (xhr, status, error) {
location.reload();
});
// Written by hand and not tested.
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var success = options.success;
options.success = function(data, textStatus, jqXHR) {
// override success handling
if(data && data.StatusCode != 200)
{
// Go to error.
return options.error(data);
}
else if(typeof(success) === "function") return success(data, textStatus, jqXHR);
};
var error = options.error;
options.error = function(jqXHR, textStatus, errorThrown) {
// override error handling
if(typeof(error) === "function") return error(jqXHR, textStatus, errorThrown);
};
});
或延迟:
$.ajaxPrefilter(function(opts, originalOpts, jqXHR) {
// you could pass this option in on a "retry" so that it doesn't
// get all recursive on you.
if ( opts.retryAttempt ) {
return;
}
var dfd = $.Deferred();
// if the request works, return normally
jqXHR.done(function(result){
// Maybe check for result != null?
if(result.StatusCode != 200) {
dfd.reject() // Manually reject
}
else {
dfd.resolve(result);
}
});
jqXHR.fail(dfd.reject);
// NOW override the jqXHR's promise functions with our deferred
return dfd.promise(jqXHR);
});
可以找到 ajaxPrefilter
的更完整示例 here。
我认为问题在于您每次都返回 HttpResponseMessage,您应该抛出响应异常:
var resp = new HttpResponseMessage(HttpStatusCode.BadRequest);
throw new HttpResponseException(resp);
用这段代码在客户端解决了。根据@smoksnes 的回复,IExceptionFilter
和 ExceptionFilterAttribute
不在我的项目中,我怀疑是 Umbraco。
.done(function (data) {
if (data.indexOf("StatusCode: 400") !== -1) {
$(window).scrollTop(0);
location.reload();
} else {
element.closest('tr').remove();
}
})
jQuery 1.11.3 Post 从 HttpResponseMessage 接收到 Bad Request 但没有进入失败状态。来自服务器的消息是以下字符串:
"StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content: , Headers: { }"
我不应该从 HttpResponseMessage 返回一个对象,说 Bad Request 吗?我正在使用 IIS Express。
后端:
[HttpPost]
public HttpResponseMessage DeleteOrderRow(int orderRowId)
{
var row = OrderRowData.LoadItem(orderRowId);
if (row == null)
{
AddAlert(AlertStyles.Danger, "Order row does not exist");
//Below is the example being returned
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
OrderRowData.Delete(orderRowId);
AddAlert(AlertStyles.Success, "Order row has been removed");
return new HttpResponseMessage(HttpStatusCode.OK);
}
jQuery:
$(document).on('click', '.delete-order-row', function (event) {
event.preventDefault();
var element = $(this);
var id = element.data('id');
if (id == null || id === -1) {
element.closest('tr').remove();
} else {
var url = element.attr('href');
$.post(url, { orderRowId: id })
.done(function (data) {
element.closest('tr').remove();
})
.fail(function (xhr, status, error) {
location.reload();
});
}
});
更新: 在@smoksnes 提示后检查网络连接。服务器实际上发送 200 OK 即使 return new HttpResponseMessage(HttpStatusCode.BadRequest);
是从后端发送的。这是 IIS Express 的正常行为吗?
更新 2: 使用此代码在客户端解决。根据@smoksnes 的回复,IExceptionFilter
和 ExceptionFilterAttribute
不在我的项目中,我怀疑是 Umbraco。有没有其他人在 Umbraco 经历过这种情况?
.done(function (data) {
if (data.indexOf("StatusCode: 400") !== -1) {
$(window).scrollTop(0);
location.reload();
} else {
element.closest('tr').remove();
}
})
Is this normal behavior from IIS Express?
在空白项目中,这应该 return 400 Bad Request
。
public HttpResponseMessage DeleteOrderRow()
{
return new HttpResponseMessage(HttpStatusCode.BadRequest);
}
但是正如我在评论中提到的,根据网络选项卡中的信息,您似乎得到了 200 OK
。这就是导致您的客户端脚本输入 done()
的原因。这可能是由自定义过滤器引起的。
检查项目中的 IExceptionFilter
和 ExceptionFilterAttribute
。
一个常见的解决方案是在 Gobal.asax 中添加这些过滤器:
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute()); // Or whatever filter you got.
filters.Add(new AjaxExceptionLoggingFilter());
}
}
他们可以将响应更改为 200 OK
。
此外,根据 url,您似乎在使用 Umbraco。我对它不是很熟悉,但那里可能有一些魔法。如果服务器端无法解决,可以在客户端解决:
//Quick fix (dirty)
$.post(url, { orderRowId: id })
.done(function (data) {
if(data.StatusCode != 200)
{
// do error stuff..
return;
}
element.closest('tr').remove();
})
.fail(function (xhr, status, error) {
location.reload();
});
// Written by hand and not tested.
$.ajaxPrefilter(function(options, originalOptions, jqXHR) {
var success = options.success;
options.success = function(data, textStatus, jqXHR) {
// override success handling
if(data && data.StatusCode != 200)
{
// Go to error.
return options.error(data);
}
else if(typeof(success) === "function") return success(data, textStatus, jqXHR);
};
var error = options.error;
options.error = function(jqXHR, textStatus, errorThrown) {
// override error handling
if(typeof(error) === "function") return error(jqXHR, textStatus, errorThrown);
};
});
或延迟:
$.ajaxPrefilter(function(opts, originalOpts, jqXHR) {
// you could pass this option in on a "retry" so that it doesn't
// get all recursive on you.
if ( opts.retryAttempt ) {
return;
}
var dfd = $.Deferred();
// if the request works, return normally
jqXHR.done(function(result){
// Maybe check for result != null?
if(result.StatusCode != 200) {
dfd.reject() // Manually reject
}
else {
dfd.resolve(result);
}
});
jqXHR.fail(dfd.reject);
// NOW override the jqXHR's promise functions with our deferred
return dfd.promise(jqXHR);
});
可以找到 ajaxPrefilter
的更完整示例 here。
我认为问题在于您每次都返回 HttpResponseMessage,您应该抛出响应异常:
var resp = new HttpResponseMessage(HttpStatusCode.BadRequest);
throw new HttpResponseException(resp);
用这段代码在客户端解决了。根据@smoksnes 的回复,IExceptionFilter
和 ExceptionFilterAttribute
不在我的项目中,我怀疑是 Umbraco。
.done(function (data) {
if (data.indexOf("StatusCode: 400") !== -1) {
$(window).scrollTop(0);
location.reload();
} else {
element.closest('tr').remove();
}
})