[英]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。
這些是餅干:
我使用“InProc”作為我的會話狀態,應該在應用程序回收/重啟后重置,這是我的目標,但我不知道為什么在應用程序重啟后,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.