MVC4:服务器重启后,无法发布ajax内部服务器错误500

时间:2016-12-20 08:36:32

标签: c# ajax asp.net-mvc asp.net-mvc-4 cookies

我正在构建一个MVC应用程序。它表现得如此奇怪。如果我在我的开发服务器(visual studio调试)上运行它,即使我通过更改web.config多次重启我的应用程序,它运行正常,但是当我托管它时,它表现得如此奇怪。

对于第一次加载,一切正常。我可以正常加载所有页面,通过ajax等发布,但是在我使用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。

这些是cookies:

  1. .ASPXAUTH
  2. ASP.NET_SessionId
  3. 我使用" InProc" 作为我的会话状态,应该在应用程序回收/重启后重置,这是我的目标,但我不知道为什么在应用程序重启后,饼干还在那里。

    所以我想要的是在服务器重新启动时使所有用户的会话无效。

    解决方案是:

    1. 获取所有用户的所有会话并使其无效
    2. 在Application_End()
    3. 中注销所有登录用户

      我的研究无法解决这两种问题。请帮忙

4 个答案:

答案 0 :(得分:1)

我认为,this将帮助您设置每次App池重新启动时触发的事件,然后this将帮助您使该事件中的所有Cookie失效。

答案 1 :(得分:1)

AntiForgeryToken (存储在隐藏字段中)将在应用重启后发生变化,因此上一个应用会话中使用的所有值(已在浏览器中加载到HTML中)已经过时了。您需要在应用程序启动后刷新页面以获取新令牌值,否则将拒绝所有ajax调用! 还有一个名为“__RequestVerificationToken”的cookie用于存储该值,如果存在,您还需要删除该值。

答案 2 :(得分:0)

由于您遇到Cookie问题,您可以使用此方式清除所有Cookie

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

您可以在致电HttpRuntime.UnloadAppDomain()

时拨打电话

Cookie存活,因为它们不在服务器端; - )

答案 3 :(得分:0)

错误是因为服务器重启后cookie没有失效。

所以这就是我的所作所为:

每次服务器重新启动时,服务器都会创建一个cookie,用于保存应用程序启动的时间,然后将其传递给所有用户。

在Global.asax“Application_BeginRequest”中,检查保存应用程序开始时间的cookie,如果cookie保持较早时间,则:

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

删除所有令人不安的Cookie。之后,用户被重定向到登录页面。