【问题标题】:Web Api dynamic urlWeb API 动态 url
【发布时间】:2018-01-17 20:39:16
【问题描述】:

我想在我的 api 中再添加一个参数,但它不是固定的。在这种情况下,{config} 可以是 config1、config2、config1433....

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{config}/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

我已经尝试使用委托处理程序获取参数并将其从请求 uri 中删除,但它不起作用,因为 url 已被分析。

【问题讨论】:

  • 你不需要做任何复杂的事情,如果你只能有一个名为“id”的参数,那将是非常有限的。我喜欢使用属性路由,更容易让你的路由随心所欲。 docs.microsoft.com/en-us/aspnet/web-api/overview/…
  • 我认为情况不同。我要传递的这个参数独立于任何控制器或动作。我不想将它传递给所有控制器或所有操作。
  • 我不明白你在问什么。
  • 使用属性参数,我将在所有操作中进行装饰和阅读。我所有的行为都必须接受这个属性。我想要在 web api 堆栈中更通用和更早的东西。这就是我尝试使用 routeTemplate 的原因。或者,另一种选择可以像子域一样使用它。类似 {config}.myhost.com/api/{controller}/{id}
  • 您知道您可以映射多个路线模板吗?您可以根据需要映射任意数量。

标签: c# asp.net-web-api


【解决方案1】:

我找到了解决方案。

首先我必须从 DefaultHttpControllerSelector 继承。派生此类允许您自定义控制器选择。就我而言,就是这么简单。

public class CustomControllerSelector : DefaultHttpControllerSelector
{
    private HttpConfiguration _config;

    public IHttpControllerSelector PreviousSelector { get; set; }

    public CustomControllerSelector(HttpConfiguration configuration):base(configuration)
    {
        _config = configuration;
    }

    public override HttpControllerDescriptor SelectController(HttpRequestMessage request)
    {
        var uriSegments = request.RequestUri.Segments;
        var system = uriSegments[2];

        request.RequestUri = new System.Uri(request.RequestUri.AbsoluteUri.Replace(system, ""));

        var controllerDescriptor = PreviousSelector.SelectController(request);

        return controllerDescriptor;
    }
}

我不得不用我的自定义替换默认的。但是我保存了上一个,因为我在处理 url 之后使用了它。

var previousSelector = config.Services.GetService(typeof(IHttpControllerSelector)) as IHttpControllerSelector;
config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector(config) { PreviousSelector = previousSelector});

这是我的参考。

ASP.NET Web API custom IHttpControllerSelector for a single route

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2023-03-20
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多