[英]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.