【问题标题】:Ajax POST call to ASP.NET MVC controller giving net::ERR_CONNECTION_RESET对 ASP.NET MVC 控制器的 Ajax POST 调用给出 net::ERR_CONNECTION_RESET
【发布时间】:2015-03-12 17:22:24
【问题描述】:

我对这个问题束手无策。我创建了一个正在本地开发和运行的 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,
    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 只是“错误”,而 jqXHR.status 只是 0。

有什么想法吗?

【问题讨论】:

  • 如果我必须调试它,我将从检查内容类型开始。您能否尝试添加 dataType: "text" 并注释掉 "accepts"。只是我自己会开始的事情。

标签: c# ajax asp.net-mvc ssl-certificate


【解决方案1】:

我也遇到过同样的问题。在我的情况下,内部异常消息包含 \r\n 字符。经过测试,发现HttpStatusCodeResult中的statusDescription参数并不像这样。 (我不知道为什么)我只是使用下面的代码来删除字符,然后一切都按预期工作。

exception.Message.Replace("\r\n", string.Empty);

希望这对其他人有帮助! :)

【讨论】:

  • 很奇怪。虽然解决了我的问题。干杯!
  • 谢谢!这是我错误的原因。关于为什么它在这里不起作用的具体答案:stackoverflow.com/a/11917247
【解决方案2】:

我已经解决了这个问题。我不明白为什么会这样,但似乎返回 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 + "', '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("{}");
    }
}

一切正常。

我很想知道为什么。但是,目前,这是我的解决方案。

【讨论】:

    【解决方案3】:

    我也遇到了这个问题,还认为这是一个 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);
    }
    

    我不知道为什么会这样,上面只是一个例子,在我的实际情况中,我有十几个属性,包括其他对象的属性。我将所有属性复制到匿名对象并开始工作。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2017-01-24
      • 2021-10-02
      • 2014-06-17
      • 1970-01-01
      • 2023-04-08
      • 2013-04-17
      • 2020-07-16
      相关资源
      最近更新 更多