簡體   English   中英

如何在 .Net 7 MVC 應用程序中注冊自定義 IRouter?

[英]How to Register Custom IRouter in .Net 7 MVC Application?

我有一個自定義 IRouter 實現,但我不知道如何在 .Net 7 MVC 應用程序中注冊它。

我想要完成的是:傳入請求的形式為https://example.com/{id}並且當這樣的請求進入時,我需要訪問數據庫以檢索 controller 和針對該{id}的操作,對其進行一些檢查,如果一切正常,則將請求連同整個 RequestContext 傳遞給默認路由器。 其背后的原因是這樣的 url 僅對給定時間和訪問用戶的子集有效。 此外,通過查看 url 一定不能猜到基本操作和 controller。

我想出的是一個 cutom IRouter 實現(它也允許我創建那些 Urls)但我似乎無法弄清楚如何在應用程序啟動時注冊。

在 .Net 7 中使用自定義 IRouter 仍然是正確的方法嗎? 我如何注冊一個? 還是我完全走錯了路?

一種選擇是從端點路由切換回來:

builder.Services.AddMvc(options => options.EnableEndpointRouting = false); 

app.UseMvc(routeBuilder => routeBuilder.Routes.Add(new CustomRouter(routeBuilder.DefaultHandler)));

更新程序

替代方法是使用MapDynamicControllerRoute 沿着這條線的東西:

builder.Services.AddScoped<MyDynamic>();
// ...
app.MapDynamicControllerRoute<MyDynamic>("/{*internalid}");

public class MyDynamic: DynamicRouteValueTransformer
{
    public override ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
    {
        if (values.TryGetValue("internalid", out var value) && value is string s && s == "777") // simulate some search for id
        {
            values["controller"] = "Home";
            values["action"] = "test";
        }
        return new ValueTask<RouteValueDictionary>(values);
    }
}

請注意,由於您仍在使用默認路由管道,這看起來像是通過默默無聞的安全性,這通常不是一個好方法,您可能應該更好地實施適當的安全限制(您不應該依賴“不可能”來猜測實際路由) .

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM