gpt4 book ai didi

c# - 如何将 slug 添加到 asp.net 核心网站中的所有链接生成?

转载 作者:太空狗 更新时间:2023-10-29 21:52:44 25 4
gpt4 key购买 nike

我需要能够控制由我的 Url.Content("~") 调用生成的链接,以便能够在链接的开头接受 Slug。基本上托管 URL 将位于负载均衡器之后,并且可能位于根级别或更友好的 Url 之后......

举个例子:该站点配置为在 http://localhost:5001 下运行, 所以 Url.Content("~/scripts/site.js") 会生成 "/scripts/site.js"

如果浏览器直接访问该 url 甚至别名(例如 www.mysite.com),这很好。

但我希望能够灵活地在 www.mysite.com/Slug 下托管网站(想想证书等)...

现在我生成的链接转到 www.mysite.com/scripts.site.js,它解析为 404。

理想情况下,slug 可以在自定义 IUrlHelper 中配置,甚至可以在自定义 LinkGenerator 中配置,但我似乎无法注入(inject)它们并覆盖当前的。

我试过:

services.AddScoped<IUrlHelper>(x =>
{
var actionContext = x.GetService<IActionContextAccessor>().ActionContext;
return new MyCustomUrlHelper(actionContext);
});

但无法注入(inject)。当我尝试调试时,我注意到如果您在 Controller 中调用相同的命令,您将获得 Microsoft.AspNetCore.Mvc.Routing.EndpointRoutingUrlHelper 的实例。

有没有一种方法可以在不创建自定义帮助程序的情况下更改它(因为在某些区域会遗漏它并且会使调试几乎不可能找到被滥用的帮助程序)

最佳答案

直接绑定(bind) IUrlHelper 没有效果,因为 MVC 使用工厂在内部解析实例。要在您的 Controller 和 Razor View 中获取您自己的自定义 URL 帮助程序的实例,您需要在您的启动类中提供 IUrlHelperFactory 的自定义实现。

以下代码片段允许您使用自己的功能装饰原始 URL 帮助器:

在您的Startup 类中,您需要为IUrlHelperFactory 添加具有单例作用域的自定义实现after AddMvc :

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSingleton<IUrlHelperFactory, CustomUrlHelperFactory>();
}

自定义实现可能如下所示:

public class CustomUrlHelper : IUrlHelper
{
private IUrlHelper _originalUrlHelper;

public ActionContext ActionContext { get; private set; }

public CustomUrlHelper(ActionContext actionContext, IUrlHelper originalUrlHelper)
{
this.ActionContext = actionContext;
this._originalUrlHelper = originalUrlHelper;
}

public string Action(UrlActionContext urlActionContext)
{
return _originalUrlHelper.Action(urlActionContext);
}

public string Content(string contentPath)
{
return _originalUrlHelper.Content(contentPath);
}

public bool IsLocalUrl(string url)
{
return _originalUrlHelper.IsLocalUrl(url);
}

public string Link(string routeName, object values)
{
return _originalUrlHelper.Link(routeName, values);
}

public string RouteUrl(UrlRouteContext routeContext)
{
return _originalUrlHelper.RouteUrl(routeContext);
}
}

public class CustomUrlHelperFactory : IUrlHelperFactory
{
public IUrlHelper GetUrlHelper(ActionContext context)
{
var originalUrlHelperFactory = new UrlHelperFactory();
var originalUrlHelper = originalUrlHelperFactory.GetUrlHelper(context);
return new CustomUrlHelper(context, originalUrlHelper);
}
}

关于c# - 如何将 slug 添加到 asp.net 核心网站中的所有链接生成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54729700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com