繁体   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