.Net Core Переписать строгий URL - PullRequest
0 голосов
/ 09 сентября 2018

У меня проект на .net core 2.1, где я переписываю URL как

var rewrites = new RewriteOptions()
                    .AddRewrite(@"GetCountryInfo", "Home/GetCountryInfo", skipRemainingRules: true)
                    .AddRewrite(@"about-us", "Home/About", skipRemainingRules: true)
                    .AddRewrite(@"pricing", "Home/Pricing", skipRemainingRules: true)
                    .AddRewrite(@"sign-in", "Home/Sign_in", skipRemainingRules: true)
                    .AddRewrite(@"sign-up", "Home/Sign_up", skipRemainingRules: true)

Работает нормально, но когда что-то добавляется с этим URL, то также работает, что недопустимо.

Как

localhost:5000/about-us/abc
localhost:5000/about-us1

Я хочу игнорировать этот / abc или 1 из URL. Как я могу этого достичь?

1 Ответ

0 голосов
/ 14 сентября 2018

Наконец я решил это двумя способами. Теперь опишу подробнее.

  1. Реализация UrlRules:

Я написал класс, который наследуется от IRule, например

public class UrlRules : IRule
    {
        public void ApplyRule(RewriteContext context)
        {
            var request = context.HttpContext.Request;
            if (!IsValidUrl(request.Path))
            {
                var response = context.HttpContext.Response;
                response.StatusCode = StatusCodes.Status404NotFound;
                context.Result = RuleResult.EndResponse;
                response.Headers[HeaderNames.Location] = "/home/error";

            }
        }
        public bool IsValidUrl(string path)
        {
            bool urlValid = false;
            switch (path)
            {
                case "/":
                case "/about-us":
                case "/about-us/":
                case "/GetCountryInfo":
                case "/pricing":
                case "/pricing/":
                case "/sign-in":
                case "/sign-in/":
                case "/sign-up":
                case "/sign-up/":
                    urlValid = true;
                    break;
                default:
                    urlValid = false;
                    break;
            }
            return urlValid;
        }
    }

Затем настройте маршрут как

app.UseMvc(routes =>
            {
                var rewrites = new RewriteOptions()
                    .Add(new UrlRules())
                    .AddRewrite(@"GetCountryInfo", "Home/GetCountryInfo", skipRemainingRules: true)
                    .AddRewrite(@"about-us", "Home/about", skipRemainingRules: true)
                    .AddRewrite(@"pricing", "Home/Pricing", skipRemainingRules: true)
                    .AddRewrite(@"sign-in", "Home/Sign_in", skipRemainingRules: true)
                    .AddRewrite(@"sign-up", "Home/Sign_up", skipRemainingRules: true);


                app.UseRewriter(rewrites);
                routes.MapRoute(
                    name:"default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

Это работает.

  1. Определение маршрута:

Это идеальный способ для меня. Просто определяя маршрут к каждому действию как

[Route("~/about-us")]
        public IActionResult About()
        {
            return View();
        }

Для меня это идеальное решение, потому что оно работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...