簡體   English   中英

在 ASP.NET Core 中進行服務配置時如何獲取基本路由?

[英]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 中獲取字符串。

  1. 在 appsettings.json 中創建 AppUrl 部分
"AppUrl": {
    "BusinessUrl": "http//..",
     .... another urls if needed
   
},

2.為本節創建類

 public class AppUrlSettings
  {
        public string BusinessUrl{ get; set; }

        ....another urls
   }
  1. 在啟動時配置設置
services.Configure<AppUrlSettings>(Configuration.GetSection("AppUrl"));
  1. 現在你可以像這樣使用它們
public class MyClass
    {
        private readonly IOptions<AppUrlSettings> _appUrls;

        public MyClass (IOptions<AppUrlSettings> appUrls)
        {
            _appUrls = appUrls;
        }

        public string GetBusinessUrl()
        {
            return _appUrls.Value.BussinesUrl;
        }
}

LinkGeneratorIHttpContextAccessor注入您的服務;

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 ,但您需要從其他地方提供hostschemepathBase 從配置中,或者通過實現中間件從第一個請求中捕獲它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM