2015-06-26 27 views
1

當運行一個Ajax請求,我得到一個錯誤信息:阿賈克斯HTTP 500錯誤Azure的不是本地

無法加載資源:服務器與500 (OK)狀態

迴應

問題是服務器錯誤似乎沒有發生。當我在本地機器上運行該應用程序但使用azure數據庫時,我沒有收到錯誤消息。只有已發佈的天青應用程序纔會生成此錯誤。我已經完成了遠程調試,即使瀏覽器顯示此錯誤,服務器仍然處理請求,幾分鐘後它完成請求。就好像實際上沒有服務器錯誤。

服務器需要大約10分鐘才能完成請求。我相信這與它的請求很長(因爲它適用於較小的數據庫)有關。我知道Azure對應用程序服務級別的CPU時間有限制,但我切換到基本(沒有cpu時間限制),所以不應該是一個問題。請求是非常強烈的sql(大約20k sql查詢)。

Ajax調用:

$.ajax({ 
    async: true, 
    cache: false, 
    type: "POST", 
    url: FooURL, 
    contentType: 'application/json', 
    dataType: "json", 
    data: JSON.stringify(null), 
    success: function (error_message) { 
    $("#FooBar").removeClass("loading"); 
    }, 
    error: function(jqXHR, textStatus, errorThrown) { 
    console.log(textStatus, errorThrown); 
    } 
}); 

控制器:

[Authorize] 
    [RequireHttpsAttribute] 
    public class FooController : Controller 
    { 
    private FooBarModel foobarModel = new FooBarModel(); 

    public ActionResult UpdateFooBarModel() 
    { 
     foobarModel.UpdateModel(); 
     return Json("Success"); 
    } 

回答

0

有明顯其中描述here天青的空閒超時。默認值設置爲4分鐘,如果在虛擬機上運行應用程序,則可將其配置爲最長30分鐘。我通過在數據庫中創建一個表來存儲當前的請求狀態,從而解決了這個問題。

表:

CREATE TABLE [dbo].[MyTable] (
[UpdateNo] INT IDENTITY (1, 1) NOT NULL, 
[AllDone] BIT DEFAULT ((0)) NOT NULL, 
CONSTRAINT [MyTable$PrimaryKey] PRIMARY KEY CLUSTERED ([UpdateNo] ASC) 

);

不是直接調用方法,而是創建一個任務並返回更新狀態行的ID。

public ActionResult UpdateFooBarModel() 
{ 
    int id = foobarModel.StartUpUpdate(); //Creates the status row 
    Task.Run(() => foobarModel.UpdateModel(id)); 
    return Json(id); 
} 

public ActionResult GetUpdateStatus(int UpdateNo) 
{ 
    bool status = foobarModel.GetUpdateStatus(UpdateNo); 
    return Json(status); 
} 

Ajax調用:

function check_status(StatusId) { 
$.ajax({ 
    async: true, 
    cache: false, 
    type: "POST", 
    url: GetUpdateStatusURL + "/?UpdateNo=" + StatusId, 
    contentType: 'application/json', 
    dataType: "json", 
    success: function (StatusDone) { 
    if (StatusDone == true) { 
     console.log("Update done!"); 
     $("#FooBar").removeClass("loading"); 
    } else { 
     console.log("Not done!") 
     setTimeout(function() { 
     check_status(StatusId); 
     }, 5000); //Check every 5 seconds 
    } 
    }, 
    error: function (jqXHR, textStatus, errorThrown) { 
    console.log(textStatus, errorThrown); 
    } 
}); 

}