ASP.NET MVC找不到我的控制器方法

问题描述

我有一个带有Reset方法的UserController:

/// <summary>
/// Resets the current user context.
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult Reset()
{
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.ActiveCaseID); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.ActiveEventID); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.CompanyID); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.ConnectionString); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.ImpersonateUserToken); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.LoginID); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.LoginName); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.MultiSystem); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.ServerName); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.SystemID); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.UserID); } catch { }
    try { IAppContext.ClientStateManager.RemoveValue(CookieName.UserName); } catch { }

    LogSecurityEvent(SecurityLogType.InvokedReset);

    return Content("Reset Completed");
}

但是由于某种原因,当我导航到适当的URL时,找不到此方法(或其他任何方法)(我收到404错误)。 https://localhost:31503/User/Reset。我在这台PC上没有SSL证书,但是该Web应用程序确实可以在另一台PC上运行,除非那里很早就设置好了并且忘记了它,否则我也没有PC上的证书。我现在无法使用该PC进行检查,我什至不知道在哪里查看。如果我转到http://localhost:31503/User/Reset,则该应用程序仅挂起一会儿,然后出现“连接已重置”浏览器错误。当我连接调试器并将其设置为在所有.NET异常时都中断时,我看不到任何异常被吞没。

这是我的RouteConfig类-很简单,虽然我对路由了解不多,但看起来并不复杂...

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home",action = "Index",id = UrlParameter.Optional }
        );
    }
}

编辑:哦,有一些相关的内容:今天早晨,“用户/重置”操作“正在工作”(至少显示了预期的消息),但是实际的登录却没有。它给了我空白页。当我连接调试器时,我发现一个名为AppContext的类将一个异常吞没了,该类除其他外还跟踪数据库连接字符串:

public string ConnectionString
{
    get
    {
        lock (_Lock)
        {
            if (String.IsNullOrEmpty(_connectionString))
            {
                object raw = ClientStateManager.GetValue(CookieName.ConnectionString);
                if (null != raw)
                {
                    _connectionString = raw.ToString().FromEncryptedBase64();
                }
            }
            return _connectionString;
        }
    }
}

因此,如果cookie不存在,则该应用程序找不到任何连接字符串,并在尝试连接到数据库时崩溃!我以前不知道这是怎么工作的。在我看来,没有新用户登录是不可能的。然后,我在if语句之后添加了以下几行来进行修复:

else
{
    _connectionString = ConfigurationManager.ConnectionStrings["Root.Properties.Settings.myapp_configConnectionString"].ConnectionString.FromEncryptedBase64();
}

但是,现在我到处都是这些404错误。这是来自web.config的相关行:

<add name="Root.Properties.Settings.myapp_configConnectionString" connectionString="(an encrypted connection string is here)" providerName="System.Data.sqlClient" />

FromEncryptedBase64只是一种扩展方法,它采用64位基本字符串,将其解码,然后对其应用解密算法;这是一种将连接字符串安全存储在web.config中的方法,而不必以纯文本格式存储它们。

解决方法

我的版本评论是为了使您能够解决您的SSL证书,因为有一个内置的Core工具(也许也是4.x,但是我有一段时间没有使用它了。)

您可能只需要添加一条特定的路由,因为此方法不需要id,就像默认路由一样。您可以通过以下两种方式之一进行操作:

选项1

// add an explicit route
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "UserReset",url: "User/Reset"
        );

        routes.MapRoute(
            name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home",action = "Index",id = UrlParameter.Optional }
        );
    }
}

选项2

// attribute based routing in the controller
[HttpGet]
[Route("User/Reset")]
public ActionResult Reset()
{
// your code
}