Ищете способ, чтобы классы автоматически регистрировали себя в качестве конечной точки - PullRequest
0 голосов
/ 28 апреля 2020

Я преобразую веб-приложение. NET Framework 4.8, построенное на основе Generi c Обработчики, в веб-приложение. NET Core 3.1.

Я ищу способ каждый из моих пользовательских классов страниц мог автоматически регистрировать себя в качестве конечной точки на этапе запуска. Сейчас это ручной процесс, который я хотел бы упростить.

Это то, с чем я работаю до сих пор.

using System.IO;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.FileProviders;

namespace App
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseStaticFiles();
            app.UseStaticFiles(StaticFolder("/Resources"));
            app.UseStaticFiles(StaticFolder("/Clients"));

            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGet("/", Page<Default>);

                endpoints.MapGet("/Login.ashx", Page<Login>);
                endpoints.MapPost("/LoginPostBack.ashx", Page<LoginPostBack>);
                endpoints.MapGet("/Logout.ashx", Page<Logout>);
                endpoints.MapPost("/LogoutPostBack.ashx", Page<LogoutPostBack>);

                endpoints.MapGet("/Clients/", Page<Clients.Default>);
                endpoints.MapPost("/Clients/", Page<Clients.DefaultPostBack>);
                endpoints.MapGet("/Clients/Add.ashx", Page<Clients.Add>);
                endpoints.MapPost("/Clients/AddPostBack.ashx", Page<Clients.AddPostBack>);
                endpoints.MapGet("/Clients/Modify.ashx", Page<Clients.Modify>);
                endpoints.MapPost("/Clients/ModifyPostBack.ashx", Page<Clients.ModifyPostBack>);
                endpoints.MapGet("/Clients/Delete.ashx", Page<Clients.Delete>);
                endpoints.MapPost("/Clients/DeletePostBack.ashx", Page<Clients.DeletePostBack>);
            });
        }

        private async Task Page<T>(HttpContext context) where T : new()
        {
            T page = new T();
            await ((IPage)page).ProcessRequest(context);
        }

        private StaticFileOptions StaticFolder(string path)
        {
            return new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), path.Substring(1))),
                RequestPath = path
            };
        }
    }
}

Ниже приведен пример пользовательского класса страницы:

using System.Web;

namespace App
{
    public class Default : FormPage
    {
        protected override void PreProcess()
        {
            Page.Icon = "far fa-home";
            Page.Title = "Home";
        }

        protected override void Process()
        {
            Write(@"<div class=""row mb-4"">");

            Write(@"<div class=""col-12"">");
            Write(@"<h5>Home</h5>");
            Write(@"</div>");

            Write(@"</div>");
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я решил это с помощью отражения:

app.UseEndpoints(endpoints =>
{
    foreach (Type pageType in Assembly.GetExecutingAssembly().DefinedTypes)
        if (typeof(IPage).IsAssignableFrom(pageType))
        {
            IPage pageInstance = (IPage)Activator.CreateInstance(pageType);

            MethodInfo pageMethod = typeof(Startup).GetMethod("Page");
            MethodInfo delegateMethod = pageMethod.MakeGenericMethod(pageType);
            RequestDelegate requestDelegate = (RequestDelegate)RequestDelegate.CreateDelegate(typeof(RequestDelegate), this, delegateMethod);

            endpoints.MapGet(pageInstance.Endpoint, requestDelegate);
        }
});
0 голосов
/ 28 апреля 2020

Проблема заключается в том, что вы пытаетесь сохранить URL-адреса, заканчивающиеся на ashx, даже если это не имеет значения в ASP. NET Core. Страницы Razor имеют соглашения по умолчанию о том, как структурируются URL-адреса, которые в значительной степени совпадают с вашими URL-адресами здесь, за исключением ashx.

Если вы просто пытаетесь сохранить существующую структуру URL-адресов (нет 404-х) ), правильная вещь здесь - создать постоянные перенаправления, например от Login.ashx до Login. Тогда стандартная маршрутизация по умолчанию будет работать, и если кто-то сделает go со старым URL, он будет просто перенаправлен на новый.

...