Asp.Net MVC 5 路由未命中控制器,而 RouteDebugger 在路由上显示为 true 且未命中断点

Asp.Net MVC 5 route not hitting the controller while RouteDebugger says on the route true and Breakpoints are not hit

您好, 我遇到一个问题,当使用 Route Debugger 检查时,路由是正确的,它说它是真实的并且可以工作,但是控制器没有被击中,并且代码上的断点在启动控制器时不起作用。

我在我的项目中使用区域,项目结构是:

面积

---管理员

--------控制器

--------------------AdminArticle

--------------------管理主页

---网络

控制器

------------首页

------------GFilesController

------------ArticleGFilesController

型号

------文章

------专辑

------等等

我的路线代码:

using System.Web.Mvc;
using System.Web.Routing;

namespace Falestinona2016V1
{

    public class RouteConfig {

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

            //HttpMethodConstraint GetFileMethodConstraints = new HttpMethodConstraint(new string[] { "GET" });
            //Route GetFileRoute = new Route(
            //  url: "ArticleFilesManager/{UID}/{id}/{filename}",
            //  routeHandler: new DobImageRouteHandler(),
            //  defaults: null,
            //  constraints: new RouteValueDictionary { { "httpMethod", GetFileMethodConstraints } }
            //);
            //routes.Add("GetFileRoute", GetFileRoute);

            routes.MapRoute(
                name: "Delete File",
                url: "ArticleFilesManager/{UID}/{id}/{filename}",
                defaults: new { controller = "ArticleGFilesController", action = "Delete", area = "" },
                constraints: new { httpMethod = new HttpMethodConstraint("DELETE") },
                namespaces: new[] { "Falestinona2016V1.Controllers" }
            ).DataTokens["UseNamespaceFallback"] = false;

            routes.MapRoute(
                name: "Get Json File List ArticleFilesManager",
                url: "ArticleFilesManager/{UID}",
                defaults: new { controller = "ArticleGFilesController", action = "List", area = "", UID = UrlParameter.Optional },
                constraints: new { httpMethod = new HttpMethodConstraint("GET") },
                namespaces: new[] { "Falestinona2016V1.Controllers" }
            ).DataTokens["UseNamespaceFallback"] = false;

            routes.MapRoute(
                name: "PostArticleFilesUploadManager",
                url: "ArticleFilesManager/{UID}",
                defaults: new { controller = "ArticleGFilesController", action = "Uploads", area = "" },
                constraints: new { httpMethod = new HttpMethodConstraint("POST") },
                namespaces: new[] { "Falestinona2016V1.Controllers" }
            ).DataTokens["UseNamespaceFallback"] = false;

            routes.MapRoute(
                name: "ArticleFilesUploadManager",
                url: "ArticleFilesManager/{UID}",
                defaults: new { controller = "ArticleGFilesController", area = "" },
                namespaces: new[] { "Falestinona2016V1.Controllers" }
            ).DataTokens["UseNamespaceFallback"] = false;

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
                namespaces: new[] { "Falestinona2016V1.Controllers" }
            ).DataTokens["UseNamespaceFallback"] = false;
        }
    }
}

我的 GFilesController:

using Falestinona2016V1.GlobalObjects;
using Falestinona2016V1.GUtils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;

namespace Falestinona2016V1.Controllers {

    public class GFilesController : Controller {
        protected string storageRoot;

        public GFilesController() {
            storageRoot = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, AppSettings.GUploadsFolder);
        }

        public GFilesController(string subFolderCategory) : this() {
            storageRoot = Path.Combine(storageRoot, subFolderCategory + "\");
        }

        [AcceptVerbs(HttpVerbs.Delete)]
        public ActionResult Delete(string id, string filename) {
            if (id == null || filename == null) {
                return HttpNotFound();
            }

            var filePath = Path.Combine(storageRoot, id + "-" + filename);

            if (System.IO.File.Exists(filePath)) {
                System.IO.File.Delete(filePath);
            }

            return RedirectToAction("Index", "Home");
        }

        public ActionResult Find(string id, string filename) {
            if (id == null || filename == null) {
                return HttpNotFound();
            }

            var filePath = Path.Combine(storageRoot, id + "-" + filename);

            FileStreamResult result = new FileStreamResult(new FileStream(filePath, FileMode.Open), GetMimeType(filePath));
            result.FileDownloadName = filename;

            return result;
        }

        [HttpGet]
        public virtual ActionResult List() {
            var fileData = new List<ViewDataUploadFilesResult>();

            DirectoryInfo dir = new DirectoryInfo(storageRoot);
            if (dir.Exists) {
                string[] extensions = MimeTypes.ImageMimeTypes.Keys.ToArray();

                FileInfo[] files = dir.EnumerateFiles()
                         .Where(f => extensions.Contains(f.Extension.ToLower()))
                         .ToArray();

                if (files.Length > 0) {
                    foreach (FileInfo file in files) {
                        var fileId = file.Name.Substring(0, 20);
                        var fileNameEncoded = HttpUtility.HtmlEncode(file.Name.Substring(21));
                        var relativePath = "/FilesUploading/" + fileId + "-" + fileNameEncoded;

                        fileData.Add(new ViewDataUploadFilesResult() {
                            url = relativePath,
                            thumbnail_url = relativePath, //@"data:image/png;base64," + EncodeFile(fullName),
                            name = fileNameEncoded,
                            type = MimeTypes.ImageMimeTypes[file.Extension],
                            size = Convert.ToInt32(file.Length),
                            delete_url = relativePath,
                            delete_type = "DELETE"
                        });
                    }
                }
            }

            var serializer = new JavaScriptSerializer();
            serializer.MaxJsonLength = Int32.MaxValue;

            var result = new ContentResult {
                Content = "{\"files\":" + serializer.Serialize(fileData) + "}",
            };
            return result;
        }

        [HttpPost]
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Uploads() {
            var fileData = new List<ViewDataUploadFilesResult>();

            foreach (string file in Request.Files) {
                UploadWholeFile(Request, fileData);
            }

            var serializer = new JavaScriptSerializer();
            serializer.MaxJsonLength = Int32.MaxValue;

            var result = new ContentResult {
                Content = "{\"files\":" + serializer.Serialize(fileData) + "}",
            };
            return result;
        }

        protected virtual void UploadWholeFile(HttpRequestBase request, List<ViewDataUploadFilesResult> statuses) {
            for (int i = 0; i < request.Files.Count; i++) {
                HttpPostedFileBase file = request.Files[i];

                var fileId = IDGen.NewID();
                var fileName = Path.GetFileName(file.FileName);
                var fileNameEncoded = HttpUtility.HtmlEncode(fileName);
                var fullPath = Path.Combine(storageRoot, fileId + "-" + fileName);

                file.SaveAs(fullPath);

                statuses.Add(new ViewDataUploadFilesResult() {
                    url = "/Files/" + fileId + "-" + fileNameEncoded,
                    thumbnail_url = "/Files/" + fileId + "-" + fileNameEncoded, //@"data:image/png;base64," + EncodeFile(fullName),
                    name = fileNameEncoded,
                    type = file.ContentType,
                    size = file.ContentLength,
                    delete_url = "/Files/" + fileId + "-" + fileNameEncoded,
                    delete_type = "DELETE"
                });
            }
        }

        private string EncodeFile(string fileName) {
            return Convert.ToBase64String(System.IO.File.ReadAllBytes(fileName));
        }

        private string GetMimeType(string filePath) {
            return GetMimeType(new FileInfo(filePath));
        }

        private string GetMimeType(FileInfo file) {
            return MimeTypes.ImageMimeTypes[file.Extension];
        }
    }
}

我的 ArticleGFilesController:

using Falestinona2016V1.GUtils;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;

namespace Falestinona2016V1.Controllers {

    public class ArticleGFilesController : GFilesController {
        private string uid;

        public ArticleGFilesController() : base("Articles") {
            Guid tempGUID;
            if (Guid.TryParse(RouteData.Values["UID"] as string, out tempGUID)) {
                uid = tempGUID.ToString();
            }
        }

        [HttpGet]
        public override ActionResult List() {
            return Content("Test");
            try {
                var fileData = new List<ViewDataUploadFilesResult>();

                DirectoryInfo dir = new DirectoryInfo(Path.Combine(storageRoot, uid + "\"));
                if (dir.Exists) {
                    string[] extensions = MimeTypes.ImageMimeTypes.Keys.ToArray();

                    FileInfo[] files = dir.EnumerateFiles()
                             .Where(f => extensions.Contains(f.Extension.ToLower()))
                             .ToArray();

                    if (files.Length > 0) {
                        foreach (FileInfo file in files) {
                            var fileId = file.Name.Substring(0, 20);
                            var fileNameEncoded = HttpUtility.HtmlEncode(file.Name.Substring(21));
                            //var relativePath = "/FilesUploading/" + fileId + "-" + fileNameEncoded;
                            var relativePath = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded);

                            fileData.Add(new ViewDataUploadFilesResult() {
                                url = relativePath,
                                thumbnail_url = relativePath, //@"data:image/png;base64," + EncodeFile(fullName),
                                name = fileNameEncoded,
                                type = MimeTypes.ImageMimeTypes[file.Extension],
                                size = Convert.ToInt32(file.Length),
                                delete_url = relativePath,
                                delete_type = "DELETE"
                            });
                        }
                    }
                }

                var serializer = new JavaScriptSerializer();
                serializer.MaxJsonLength = Int32.MaxValue;

                var result = new ContentResult {
                    Content = "{\"files\":" + serializer.Serialize(fileData) + "}",
                };
                return result;
            }
            catch (Exception ex) {
                return Content(ex.ToString());
            }
        }

        protected override void UploadWholeFile(HttpRequestBase request, List<ViewDataUploadFilesResult> statuses) {
            for (int i = 0; i < request.Files.Count; i++) {
                HttpPostedFileBase file = request.Files[i];

                var fileId = IDGen.NewID();
                var fileName = Path.GetFileName(file.FileName);
                var fileNameEncoded = HttpUtility.HtmlEncode(fileName);
                var fullPath = Path.Combine(storageRoot, uid, fileId + "-" + fileName);

                file.SaveAs(fullPath);

                statuses.Add(new ViewDataUploadFilesResult() {
                    //url = "/Files/" + fileId + "-" + fileNameEncoded,
                    url = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded),
                    thumbnail_url = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded), //@"data:image/png;base64," + EncodeFile(fullName),
                    name = fileNameEncoded,
                    type = file.ContentType,
                    size = file.ContentLength,
                    delete_url = string.Format("/ArticleFilesManager/{0}/{1}-{2}", uid, fileId, fileNameEncoded),
                    delete_type = "DELETE"
                });
            }
        }
    }
}

我的家庭控制器:

using Falestinona2016V1.Areas.Admin;
using Falestinona2016V1.GlobalObjects;
using System.Web.Mvc;

namespace Falestinona2016V1.Controllers
{

    public class HomeController : GController {

        // GET: Home
        public ActionResult Index() {
            return RedirectToAction("Index", "AdminHome", new { area = new AdminAreaRegistration().AreaName });
        }
    }
}

我的 区域 --> 管理 --> 控制器 --> AdminHomeController

using Falestinona2016V1.Areas.Admin.AdminGlobalObjects;
using System.Web.Mvc;

namespace Falestinona2016V1.Areas.Admin.Controllers
{

    public class AdminHomeController : AdminGController {

        // GET: Admin/AdminHome
        public ActionResult Index() {
            return View();
        }
    }
}

当我在 url 时: domain/admin/adminhome

我正在尝试输入 url:domain/ArticleFilesManager/fdghdfhgdfjgkjdfg 但是没有命中 ArticleGFilesController --> 列表操作 同时使用:domain/ArticleFilesManager/c7db4817-c4f5-41c9-ae5c-d12d2d2a2f1c

我无法找出问题,而路由调试器:

Route Debugger Results Image

感谢 "rymling", 解决方案是: 去掉控制器名称中的Controller部分:

defaults: new { controller = "ArticleGFiles",