C# jQuery 1.11.3 Post接收到错误的请求,但没有失败
jQuery 1.11.3 Post接收到来自HttpResponseMessage的错误请求,但没有失败。来自服务器的消息是以下字符串: “状态代码:400,原因短语:'错误请求',版本:1.1,内容: ,标题:{}” 我是否应该从HttpResponseMessage返回一个表示请求错误的对象?我正在使用IIS Express 后端:C# jQuery 1.11.3 Post接收到错误的请求,但没有失败,c#,jquery,asp.net-mvc,umbraco,C#,Jquery,Asp.net Mvc,Umbraco,jQuery 1.11.3 Post接收到来自HttpResponseMessage的错误请求,但没有失败。来自服务器的消息是以下字符串: “状态代码:400,原因短语:'错误请求',版本:1.1,内容: ,标题:{}” 我是否应该从HttpResponseMessage返回一个表示请求错误的对象?我正在使用IIS Express 后端: [HttpPost] public HttpResponseMessage DeleteOrderRow(int orderRowId) { var
[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提示后检查了网络连接。即使返回新的HttpResponseMessage(HttpStatusCode.BadRequest),服务器实际发送200 OK代码>从后端发送。这是IIS Express的正常行为吗
更新2:使用此代码在客户端解决了此问题。根据@smoksnes回复,我怀疑我的项目中不存在IEExceptionFilter
和ExceptionFilterAttribute
。在翁布拉科还有其他人经历过吗
.done(function (data) {
if (data.indexOf("StatusCode: 400") !== -1) {
$(window).scrollTop(0);
location.reload();
} else {
element.closest('tr').remove();
}
})
这是IIS Express的正常行为吗
在空白项目中,这将返回400错误请求
但正如我在评论中提到的,根据网络选项卡中的信息,您似乎得到了一个200 OK
。这就是导致客户端脚本输入done()
的原因。这可能是由自定义筛选器引起的
检查项目中的IEExceptionFilter
和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();
});
或与
或延期付款:
$.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
。我认为问题在于您返回了一条HttpResponseMessage,每次都应该抛出一个响应异常:
var resp = new HttpResponseMessage(HttpStatusCode.BadRequest);
throw new HttpResponseException(resp);
用这段代码在客户端解决了这个问题。根据@smoksnes回复,我怀疑我的项目中不存在IEExceptionFilter
和ExceptionFilterAttribute
.done(function (data) {
if (data.indexOf("StatusCode: 400") !== -1) {
$(window).scrollTop(0);
location.reload();
} else {
element.closest('tr').remove();
}
})
检查服务器是否在“网络”选项卡中实际返回400作为状态代码。我见过一些返回200的实现,但是JSON包含另一个状态码。我没有想到这一点,对了,服务器返回了200 OK。您知道这是否是IIS Express的正常行为吗<代码>新的HttpResponseMessage(HttpStatusCode.BadRequest)代码>显然应该是400 imao。感谢您的明确回答。我在项目中找不到IEExceptionFilter
或ExceptionFilterAttribute
。不过,我正在使用Umbraco,这可能是问题所在。谢谢@smoksnes,已经做了客户端修复。不幸的是,响应甚至不是一个对象,所以我必须检查“StatusCode:400”字符串。您可以在我的问题中查看我是如何做到这一点的。@Ogglas,Umbraco IMO提供的一个非常奇怪的解决方案。如果您想要一个更通用的解决方案,您可以使用ajaxPrefilter。然后,您的所有请求将再次表现为“正常”。这无法100%工作,但会失败,这是因为服务器响应HTTP 500内部服务器错误消息。请尝试将DeleteOrderRow函数的返回类型修改为IHttpActionResult,然后返回BadRequest(“订单行不存在”);(或为了成功Ok());
var resp = new HttpResponseMessage(HttpStatusCode.BadRequest);
throw new HttpResponseException(resp);
.done(function (data) {
if (data.indexOf("StatusCode: 400") !== -1) {
$(window).scrollTop(0);
location.reload();
} else {
element.closest('tr').remove();
}
})