簡體   English   中英

MVC4:服務器重啟后,無法發布ajax內部服務器錯誤500

[英]MVC4: After server restart, cannot post ajax internal server error 500

我正在構建一個MVC應用程序。 它表現得如此奇怪。 如果我在我的開發服務器(visual studio調試)上運行它,即使我通過更改web.config多次重啟我的應用程序,它運行正常,但是當我托管它時,它表現得如此奇怪。

對於第一次加載,一切正常。 我可以正常加載所有頁面,通過ajax等發布,但是在我使用HttpRuntime.UnloadAppDomain();重新啟動服務器之后HttpRuntime.UnloadAppDomain(); 然后每次我通過ajax發布,我總是得到

內部服務器錯誤500

我不知道應用程序發生了什么,但我懷疑客戶端(用戶)緩存/ cookie出了什么問題。

我將[ValidateJsonAntiForgeryToken]屬性用於接收帖子的控制器函數。

[HttpPost]
[ValidateJsonAntiForgeryToken]
public JsonResult LoadPage(int id, string returnUrl, PageFormViewModel pageForm, string jsonFormModel)

這是處理json驗證令牌的代碼

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class ValidateJsonAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException("filterContext");
        }

        var httpContext = filterContext.HttpContext;
        var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
        AntiForgery.Validate(cookie != null ? cookie.Value : null, httpContext.Request.Headers["__RequestVerificationToken"]);
    }
}

這是我發布它的示例:

var getURL = $('#GetURL').val();
var returnUrl = $('#ReturnUrl').val();
var pageId = $('#PageId').val();
var token = $('input[name="__RequestVerificationToken"]').val();
var headers = {};
headers['__RequestVerificationToken'] = token;

var thePageForm = pageForm;
var theFormModel = formModel;

$.ajax({
    type: 'POST',
    url: getURL,
    contentType: "application/json; charset=utf-8",
    dataType: 'json',
    async: false,
    headers: headers,
    data: JSON.stringify({ id: pageId, returnUrl: returnUrl, pageForm: thePageForm, jsonFormModel: theFormModel }),
    success: function (model) { //Load the page }
    error: function()
});

我認為我有@Html.AntiForgeryToken() 實際上我的申請有什么問題? 如果問題是系統仍然接受用戶cookie但它無效,那么如何在重新啟動應用程序后重置用戶cookie?

---------------------------

更新

似乎代碼實際上能夠通過控制器操作,因此驗證令牌沒有問題,但是當代碼到達試圖從數據庫檢索數據的行時,會發生這種情況

消息:建立與SQL Server的連接時發生與網絡相關或特定於實例的錯誤。 服務器未找到或無法訪問。 驗證實例名稱是否正確,以及SQL Server是否配置為允許遠程連接。 (提供程序:SQL網絡接口,錯誤:26 - 查找指定的服務器/實例時出錯)

這是我的連接字符串:

Conn string:Data Source=ip address;Initial Catalog=the database name;Integrated Security=False;User ID=user;Password=the password;MultipleActiveResultSets=True

這是產生錯誤的代碼:

PageViewModel model = new PageViewModel();
model.Page = dbPages.Pages.Where(m => m.Id == id).First();

如果我使用隱身模式運行它,它運行正常。 那么我的應用程序究竟發生了什么?

-------------------

更新2

經過進一步的調試,我現在確定問題在於cookie。

這些是餅干:

  1. .ASPXAUTH
  2. ASP.NET_SessionId

我使用“InProc”作為我的會話狀態,應該在應用程序回收/重啟后重置,這是我的目標,但我不知道為什么在應用程序重啟后,cookie仍然存在。

所以我想要的是在重新啟動服務器時使所有用戶的會話無效。

解決方案是:

  1. 獲取所有用戶的所有會話並使其無效
  2. 在Application_End()注銷所有登錄用戶

從我的研究來看,這兩種解決方 請幫忙

我想, 將有助於您設置每次App池重新啟動時觸發的事件,然后將幫助您使該事件中的所有Cookie失效。

應用程序重新啟動后,AntiForgeryToken (存儲在隱藏字段中)將發生更改,因此上一個應用程序會話中使用的所有值(已在瀏覽器中的HTML中加載)都已過時。 您需要在應用程序啟動后刷新頁面以獲取新令牌值,否則將拒絕所有ajax調用! 還有一個名為“__RequestVerificationToken”的cookie用於存儲該值,如果存在,您還需要刪除該值。

由於您遇到cookie問題,您可以使用此方法清除所有Cookie

string[] myCookies = Request.Cookies.AllKeys;
foreach (string cookie in myCookies)
{
  Response.Cookies[cookie].Expires = DateTime.Now.AddDays(-1);
}

你可以在調用HttpRuntime.UnloadAppDomain()時調用它

Cookie存活,因為它們不在服務器端;-)

該錯誤是因為服務器重啟后cookie沒有失效。

所以這就是我做的:

每次服務器重新啟動時,服務器都會創建一個cookie,用於保存應用程序啟動的時間,然后將其傳遞給所有用戶。

在Global.asax“Application_BeginRequest”中,檢查保存應用程序開始時間的cookie,如果cookie保持較早時間,則:

WebSecurity.Logout();
Roles.DeleteCookie();

刪除所有令人不安的餅干。 之后,用戶被重定向到登錄頁面。

暫無
暫無

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

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