簡體   English   中英

對 ASP.NET MVC 控制器的 Ajax POST 調用給出 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 代碼后,我在 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。

有任何想法嗎?

我也遇到過同樣的問題。 在我的情況下,內部異常消息包含一個\\r\\n字符。 測試后,我意識到,在HttpStatusCodeResult狀態說明參數不喜歡這個。 (我不知道為什么)我只是使用下面的代碼來刪除字符,然后一切都按預期工作。

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

希望這會幫助別人! :)

我已經解決了這個問題。 我不明白為什么會這樣,但似乎返回 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("{}");
    }
}

一切正常。

我很想知道為什么。 但是,就目前而言,這就是我的解決方案。

我也有這個問題,也認為這是一個 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);
}

我不知道為什么會這樣,上面只是一個例子,在我的實際情況中,我有十幾個屬性,包括其他對象的屬性。 我將所有屬性復制到匿名對象並開始工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM