Ajax POST 调用 ASP.NET MVC 控制器给出 net::ERR_CONNECTION_RESET
Ajax POST call to ASP.NET MVC controller giving net::ERR_CONNECTION_RESET
我对这个问题束手无策。我创建了一个我正在开发的 ASP.NET MVC 5 网站,并在本地创建了 运行。我在网站上启用了 SSL。我已经为网站创建了一个自签名证书。当我对 MVC 控制器进行 ajax POST 调用时:
$.ajax({
url: "/Shop/AddToCart/" + id,
contentType: "application/json; charset=utf-8",
type: "POST",
accepts: {
json: "application/json, text/javascript"
},
statusCode: {
200: function(data) {
$("#successAlert").show();
$(function () {
var returnObject = data;
layoutVM.addProduct(returnObject);
});
},
400: function() {
$("#errorAlert").show();
}
}
});
我在 Chrome 的 JavaScript 控制台中收到以下错误:"net::ERR_CONNECTION_RESET"。它也不适用于任何其他浏览器。
我知道这个错误与 SSL 有关。正如我所说,我已经为这个站点创建了一个有效的证书。除非我遗漏了什么,否则我的工具(Chrome 开发工具、Glimpse、Fiddler)不会告诉我任何有用的信息。
有什么想法吗?
更新(2015 年 3 月 13 日):
所以进一步调查,我发现确实调用了MVC控制器动作。在那个方法中,我返回了一个 HttpStatusCodeResult:
的实例
[HttpPost]
public ActionResult AddToCart(int id)
{
int numChanges = 0;
var cart = ShoppingCart.GetCart(httpContextBase);
Data.Product product = null;
_productRepository = new ProductRepository();
product = _productRepository.GetProducts()
.Where(x => x.ProductID == Convert.ToInt32(id)).FirstOrDefault();
if (product != null)
{
numChanges = cart.AddToCart(product);
}
if (numChanges > 0)
{
JToken json = JObject.Parse("{ 'id' : " + id + " , 'name' : '" +
product.Name + "', 'price' : '" + product.Price + "',
'count' : '" + numChanges + "' }");
return new HttpStatusCodeResult(200, json.ToString());
}
else
{
return new HttpStatusCodeResult(400, "Product couldn't be added to the cart");
}
}
在使用 HTTP 200 代码的方法 returns 之后,我在 Chrome 中得到 "net:: ERR_CONNECTION_RESET"(在其他浏览器中出现错误)。请务必注意 jQuery .ajax 调用中的 200 代码处理程序永远不会被调用。返回后立即重置连接。
根据一些博客,我应该增加 maxRequestLength,我有:
<system.web>
<httpRuntime targetFramework="4.5"
maxRequestLength="10485760" executionTimeout="36000" />
</system.web>
但这并没有奏效。
更新(2015 年 3 月 13 日):
所以我更改了 $.ajax 调用以响应成功和错误,而不是像这样的特定状态代码:
$.ajax({
url: "/Shop/AddToCart/" + id,
contentType: "application/json; charset=utf-8",
type: "POST",
accepts: {
json: "application/json, text/javascript"
},
success: function (data, textStatus, jqXHR) {
// jqXHR.status contains the Response.Status set on the server
alert(data);
},
error: function (jqXHR, textStatus, errorThrown) {
// jqXHR.status contains the Response.Status set on the server
alert(jqXHR.statusCode + ": " + jqXHR.status);
}
});
现在,即使我从我的控制器代码返回 200,错误块也被命中。所以,这就是进步。但是,textStatus 只是 "error" 而 jqXHR.status 只是 0。
有什么想法吗?
我已经解决了这个问题。我不明白为什么会这样,但似乎 returning HttpStatusCodeResult 实例的更强大的解决方案是导致连接重置的原因。当我设置响应状态代码和 return 一个 JToken 对象时,如下所示:
[HttpPost]
public JToken AddToCart(int id)
{
int numChanges = 0;
var cart = ShoppingCart.GetCart(httpContextBase);
Data.Product product = null;
_productRepository = new ProductRepository();
product = _productRepository.GetProducts()
.Where(x => x.ProductID == Convert.ToInt32(id)).FirstOrDefault();
if (product != null)
{
numChanges = cart.AddToCart(product);
}
if (numChanges > 0)
{
JToken json = JObject.Parse("{ 'id' : " + id + " , 'name' : '" +
product.Name + "', 'price' : '" + product.Price + "',
'count' : '" + numChanges + "' }");
Response.StatusCode = 200;
return json;
}
else
{
Response.StatusCode = 400;
Response.StatusDescription = "Product couldn't be added to the cart";
return JObject.Parse("{}");
}
}
一切正常。
我很想知道为什么。但是,就目前而言,这是我的解决方案。
我也遇到过同样的问题。在我的情况下,内部异常消息包含一个 \r\n 字符。经过测试,发现HttpStatusCodeResult中的statusDescription参数不是这样的。 (我不确定为什么)我只是使用下面的代码删除了字符,然后一切都按预期工作了。
exception.Message.Replace("\r\n", string.Empty);
希望这对其他人有帮助! :)
我也有这个问题,也认为这是一个 SSL 问题,但在我的例子中,从我返回到一个新的匿名对象中的对象中选择数据解决了这个问题,例如:
[HttpGet]
public IActionResult GetContact(int contactId)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
Contact contact = _contactRepository.Get(contactId);
if (contact == null)
{
return NotFound();
}
return Ok(new {contact.FirstName, contact.LastName);
}
我不知道为什么会这样,上面只是一个例子,在我的实际情况下,我有十几个属性,包括其他对象的属性。我将所有属性复制到匿名对象并开始工作。
我对这个问题束手无策。我创建了一个我正在开发的 ASP.NET MVC 5 网站,并在本地创建了 运行。我在网站上启用了 SSL。我已经为网站创建了一个自签名证书。当我对 MVC 控制器进行 ajax POST 调用时:
$.ajax({
url: "/Shop/AddToCart/" + id,
contentType: "application/json; charset=utf-8",
type: "POST",
accepts: {
json: "application/json, text/javascript"
},
statusCode: {
200: function(data) {
$("#successAlert").show();
$(function () {
var returnObject = data;
layoutVM.addProduct(returnObject);
});
},
400: function() {
$("#errorAlert").show();
}
}
});
我在 Chrome 的 JavaScript 控制台中收到以下错误:"net::ERR_CONNECTION_RESET"。它也不适用于任何其他浏览器。
我知道这个错误与 SSL 有关。正如我所说,我已经为这个站点创建了一个有效的证书。除非我遗漏了什么,否则我的工具(Chrome 开发工具、Glimpse、Fiddler)不会告诉我任何有用的信息。
有什么想法吗?
更新(2015 年 3 月 13 日):
所以进一步调查,我发现确实调用了MVC控制器动作。在那个方法中,我返回了一个 HttpStatusCodeResult:
的实例[HttpPost]
public ActionResult AddToCart(int id)
{
int numChanges = 0;
var cart = ShoppingCart.GetCart(httpContextBase);
Data.Product product = null;
_productRepository = new ProductRepository();
product = _productRepository.GetProducts()
.Where(x => x.ProductID == Convert.ToInt32(id)).FirstOrDefault();
if (product != null)
{
numChanges = cart.AddToCart(product);
}
if (numChanges > 0)
{
JToken json = JObject.Parse("{ 'id' : " + id + " , 'name' : '" +
product.Name + "', 'price' : '" + product.Price + "',
'count' : '" + numChanges + "' }");
return new HttpStatusCodeResult(200, json.ToString());
}
else
{
return new HttpStatusCodeResult(400, "Product couldn't be added to the cart");
}
}
在使用 HTTP 200 代码的方法 returns 之后,我在 Chrome 中得到 "net:: ERR_CONNECTION_RESET"(在其他浏览器中出现错误)。请务必注意 jQuery .ajax 调用中的 200 代码处理程序永远不会被调用。返回后立即重置连接。
根据一些博客,我应该增加 maxRequestLength,我有:
<system.web>
<httpRuntime targetFramework="4.5"
maxRequestLength="10485760" executionTimeout="36000" />
</system.web>
但这并没有奏效。
更新(2015 年 3 月 13 日):
所以我更改了 $.ajax 调用以响应成功和错误,而不是像这样的特定状态代码:
$.ajax({
url: "/Shop/AddToCart/" + id,
contentType: "application/json; charset=utf-8",
type: "POST",
accepts: {
json: "application/json, text/javascript"
},
success: function (data, textStatus, jqXHR) {
// jqXHR.status contains the Response.Status set on the server
alert(data);
},
error: function (jqXHR, textStatus, errorThrown) {
// jqXHR.status contains the Response.Status set on the server
alert(jqXHR.statusCode + ": " + jqXHR.status);
}
});
现在,即使我从我的控制器代码返回 200,错误块也被命中。所以,这就是进步。但是,textStatus 只是 "error" 而 jqXHR.status 只是 0。
有什么想法吗?
我已经解决了这个问题。我不明白为什么会这样,但似乎 returning HttpStatusCodeResult 实例的更强大的解决方案是导致连接重置的原因。当我设置响应状态代码和 return 一个 JToken 对象时,如下所示:
[HttpPost]
public JToken AddToCart(int id)
{
int numChanges = 0;
var cart = ShoppingCart.GetCart(httpContextBase);
Data.Product product = null;
_productRepository = new ProductRepository();
product = _productRepository.GetProducts()
.Where(x => x.ProductID == Convert.ToInt32(id)).FirstOrDefault();
if (product != null)
{
numChanges = cart.AddToCart(product);
}
if (numChanges > 0)
{
JToken json = JObject.Parse("{ 'id' : " + id + " , 'name' : '" +
product.Name + "', 'price' : '" + product.Price + "',
'count' : '" + numChanges + "' }");
Response.StatusCode = 200;
return json;
}
else
{
Response.StatusCode = 400;
Response.StatusDescription = "Product couldn't be added to the cart";
return JObject.Parse("{}");
}
}
一切正常。
我很想知道为什么。但是,就目前而言,这是我的解决方案。
我也遇到过同样的问题。在我的情况下,内部异常消息包含一个 \r\n 字符。经过测试,发现HttpStatusCodeResult中的statusDescription参数不是这样的。 (我不确定为什么)我只是使用下面的代码删除了字符,然后一切都按预期工作了。
exception.Message.Replace("\r\n", string.Empty);
希望这对其他人有帮助! :)
我也有这个问题,也认为这是一个 SSL 问题,但在我的例子中,从我返回到一个新的匿名对象中的对象中选择数据解决了这个问题,例如:
[HttpGet]
public IActionResult GetContact(int contactId)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
Contact contact = _contactRepository.Get(contactId);
if (contact == null)
{
return NotFound();
}
return Ok(new {contact.FirstName, contact.LastName);
}
我不知道为什么会这样,上面只是一个例子,在我的实际情况下,我有十几个属性,包括其他对象的属性。我将所有属性复制到匿名对象并开始工作。