[英]How can I get the base route while doing service configuration in ASP.NET Core?
我在应用程序中配置了一系列服务,其中一个服务需要特定路由的基本 URL,以便我可以基于它创建链接。 所以如果我们有:
我的控制器
[Route("api/v1/fancy")]
public class FancyController {
[HttpPost]
[Route("{fancyID}")]
public async Task<IActionResult> SubmitFancy(string fancyID){
// Do fancy stuff
}
}
我的商务舱
public class Business {
private string _baseUrl;
public Business(string baseUrl){
_baseUrl = baseUrl
}
}
我的启动.cs
...
public void ConfigureServices(IServiceCollection services) {
services.AddScoped<Business>(provider => {
Business business = new Business("http://someweb.com/api/v1/fancy"); //TODO:REMOVE Hard Coded
return business;
}
services.AddRazorPages();
}
...
我尝试通过为 IActionContextAccessor 和 IUrlHelperFactory 添加更多范围服务来使用 UrlHelper,但是我在 ActionLink 和 RouteUrl 方法上得到了 null,我不知道为什么。
关于我将如何解决这个问题的任何想法?
如果您需要更多说明,请告诉我。
非常感谢你。
您不能将字符串用于属性路由。 您需要一个常量字符串。 常量是不可变的值,在编译时已知并且在程序的生命周期内不会改变。
但是,如果您需要在 ajax 或 httpclient 中使用的路由,则需要几个步骤才能从 appsettings 中获取字符串。
"AppUrl": {
"BusinessUrl": "http//..",
.... another urls if needed
},
2.为本节创建类
public class AppUrlSettings
{
public string BusinessUrl{ get; set; }
....another urls
}
services.Configure<AppUrlSettings>(Configuration.GetSection("AppUrl"));
public class MyClass
{
private readonly IOptions<AppUrlSettings> _appUrls;
public MyClass (IOptions<AppUrlSettings> appUrls)
{
_appUrls = appUrls;
}
public string GetBusinessUrl()
{
return _appUrls.Value.BussinesUrl;
}
}
将LinkGenerator
和IHttpContextAccessor
注入您的服务;
public class Business {
private readonly LinkGenerator generator;
private readonly IHttpContextAccessor accessor;
public Business (LinkGenerator generator, IHttpContextAccessor accessor){...}
public void Foo(){
var context = accessor.HttpContext;
var link = generator.GetUriByAction(
context,
"SubmitFancy",
"Fancy",
new { fancyID="..." });
}
}
services.AddScoped<Business>();
您可以LinkGenerator
不引用HttpContext
情况下使用LinkGenerator
,但您需要从其他地方提供host
、 scheme
和pathBase
。 从配置中,或者通过实现中间件从第一个请求中捕获它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.