应用服务中可以有主机地址吗?
例如,我们希望通过特定链接指向站点地址向客户发送电子邮件。这怎么可能?
这是通过谷歌提出的,现有的答案并没有真正帮助。我不一定同意应用服务是错误的领域;例如,在 ABP 中,服务与控制器紧密相连,服务通常只存在于那里为 Web 请求提供服务。他们经常在需要登录用户的授权状态下执行代码,因此整个事情都发生在 HTTP 请求/响应周期的隐式域上下文中。
services.AddHttpContextAccessor();
到类似 your- 的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 分解成片段。