如果没有HttpContext或ActionContext,如何在.NET Core中构建URL

8

我正在实现邮件发送模块并需要构建URL。我的意图是使用IUrlHelper,但由于它需要提供的大量依赖项,我真的很难构建此对象。

当前,我正在进行以下步骤:

ActionContext actionCtx = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
_urlHelper = new UrlHelper(actionCtx);

但是用这种方式构造的urlHelper仍然在尝试构建URL时出现异常。

异常如下:

索引超出了范围。必须是非负的且小于集合大小。参数名: index 在System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument参数,ExceptionResource资源)时 System.Collections.Generic.List`1.get_Item(Int32 index) Microsoft.AspNetCore.Mvc.Routing.UrlHelper.get_Router()

所以现在可能需要创建并设置IRouter实例,但我发现又需要设置大量依赖项。

那么应该如何正确地完成这个操作呢?


1
请参见 https://dev59.com/rVYO5IYBdhLWcg3wRfZ- - Bernard Vander Beken
我假设你正在后台运行一个任务(不是作为请求的一部分)?如果是这样,当我尝试实现类似功能时,@BernardVanderBeken链接的帖子是我发现的最相关的。 - SpruceMoose
1
是的,它甚至是一个独立的项目 - 只是一个定期工作。因此根本不是Web应用程序。 - silent_coder
1个回答

2
正如您所了解的,要在一个完全断开的库中实现这一点几乎是不可能的。更重要的是,您需要 路由 才能使其值得,这些路由将被清晰地限制在一个单独的 Web 应用程序中,您的库必须具有强依赖性才能访问它。如果不明显,那将是一个非常糟糕的设计选择。
我认为你需要退后一步重新评估。如果你的目标只是通过外部进程发送电子邮件,那么调度任务的任何东西(可能是你的 Web 应用程序)都应该传递它所需的关于该电子邮件的信息,包括任何 URL。这将把创建这些 URL 的责任从您的电子邮件库(本来就不应该有这个责任 - 只做一件事情并做好它)转移到一个可能已经具备必要能力的源头。
如果出于某种原因无法完成此操作。我认为你下一个最好的选择是在你试图生成 URL 的 Web 应用程序上设置一个或多个端点,并让它们返回你需要的 URL 和/或电子邮件库发送电子邮件所需的任何其他附加信息。这仍然将电子邮件发送功能外部化,但为您的库提供了一种干净的方式来在需要时访问 Web 应用程序中的信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接