应用服务中可以有主机地址吗?
例如,我们希望通过特定链接指向站点地址向客户发送电子邮件。这怎么可能?
HttpContext.Current.Request.Url
可以获得有关URL的所有信息。并且可以将url分解成碎片。
这是通过Google提出的,现有的答案并没有真正帮助。我不一定同意app服务是错误的域名;例如,在ABP中,服务与控制器紧密相连,通常只存在服务以便在那里服务Web请求。它们通常在需要登录用户的授权状态下执行代码,因此整个事情发生在HTTP请求/响应周期的隐式域上下文中。
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;
// ...
}