是否可以在 abp 框架中检索应用程序服务中的主机地址?

It is possible to retrieve host address in application service in abp framework?

应用服务中可以有主机地址吗?

例如,我们希望向客户发送特定 link 指向站点地址的电子邮件。这怎么可能?

HttpContext.Current.Request.Url

可以为您提供 URL 上的所有信息。并且可以将 url 分解成碎片。

这是通过 Google 提出的,现有答案并没有真正帮助。我不一定同意应用程序服务是错误的领域;例如,在 ABP 中,服务与控制器紧密相连,并且服务通常只存在于那里以服务 Web 请求。他们通常在需要登录用户的授权状态下执行代码,因此整个事情都发生在 HTTP request/response 循环的隐式域上下文中。

因此 - https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-context?view=aspnetcore-2.2#use-httpcontext-from-custom-components

  • services.AddHttpContextAccessor(); 添加到您的 Startup.cs 中 - 就在您已经调用 services.AddMvc().
  • 的位置之后
  • 使用依赖注入在您的服务中获取 IHttpContextAccessor - 见下文。

使用基于构造函数的依赖注入,我们添加一个私有实例变量来存储对上下文访问器的注入引用和提供引用的构造函数参数。下面的例子有一个构造函数,只有 一个参数,但是在你的代码中你可能已经有一些 - 只需添加另一个参数并在构造函数中设置 _httpContextAccessor与您已经在做的任何其他事情。

using HttpContext          = Microsoft.AspNetCore.Http.HttpContext;
using IHttpContextAccessor = Microsoft.AspNetCore.Http.IHttpContextAccessor;

// ...

public class SomeService : ApplicationService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public SomeService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }
}

现在服务代码可以读取 HTTP 上下文以及 HTTP 请求的主机和端口等信息。

public async Task<string> SomeServiceMethod()
{
    HttpContext context = _httpContextAccessor.HttpContext;
    string      domain  = context.Request.Host.Host.ToLowerInvariant();
    int?        port    = context.Request.Host.Port;

    // ...
}