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



应用服务中是否有主机地址?

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

这是通过谷歌提出的,现有的答案并没有真正的帮助。我不一定同意应用服务是错误的域;例如,在ABP中,服务与控制器紧密相连,服务通常只存在于为Web请求提供服务的情况下.它们通常在需要登录用户的授权状态下执行代码,因此整个事情发生在 HTTP 请求/响应周期的隐式域上下文中。

因此 - https://learn.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;
// ...
}

HttpContext.Current.Request.Url

可以获取URL上的所有信息。并且可以将 url 分解为其片段。

最新更新