关于这个问题,我的斗智斗勇.我创建了一个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代码后,我在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,success: function (data,textStatus,jqXHR) { // jqXHR.status contains the Response.Status set on the server alert(data); },error: function (jqXHR,errorThrown) { // jqXHR.status contains the Response.Status set on the server alert(jqXHR.statusCode + ": " + jqXHR.status); } });
现在,即使我从控制器代码返回200,错误块也被击中.那就是进步.但是,textStatus只是“错误”而jqXHR.status只是0.
有任何想法吗?
解决方法
我已经解决了这个问题.我不明白为什么会这样,但似乎返回HttpStatusCodeResult实例的更强大的解决方案是导致连接重置的原因.当我设置响应状态代码并返回一个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 + "','count' : '" + numChanges + "' }"); Response.StatusCode = 200; return json; } else { Response.StatusCode = 400; Response.StatusDescription = "Product couldn't be added to the cart"; return JObject.Parse("{}"); } }
一切正常.
我很乐意理解为什么.但是,就目前而言,这是我的解决方案.