URL以正斜杠结束时出现意外的Web API路由

时间:2014-12-02 20:39:36

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

我正在使用Web API 2,当URL以正斜杠结束时,我看到了意外的路由行为。我的Web API配置如下所示。

    public void Configuration(IAppBuilder appBuilder)
    {
        HttpConfiguration webApiConfig = new HttpConfiguration();
        webApiConfig.MapHttpAttributeRoutes();
        webApiConfig.EnsureInitialized();

        appBuilder.UseWebApi(webApiConfig);
    }

在WebApp.Start()中,我传递了网址http://host:port/configuration

我有两条路线设置。

    [Route("~/")]
    public object GetResourcesList()
    {
        return new List<string>() { "Resource 1", "Resource 2", "Resource n" };
    }

    [Route("~/{resourceName}")]
    public object GetResource(string resourceName)
    {
        return "Resource " + resourceName;
    }

如果我向http://host:port/configuration/发出GET请求,则会按预期调用GetResourceList()

如果我向http://host:port/configuration发出GET请求(最后没有正斜杠),则调用GetResource()并返回“资源配置”。我希望通过电话GetResourceList()

为什么在第二个例子中调用GetResource()?当WebApp.Start应该在http://host:port/configuration而不是http://host:port上监听时,为什么它会将配置作为resourceName传递?

我还分别为[Route("")][Route("{resourceName}")]尝试了GetResourceList()GetResource(),并看到了同样的行为。

感谢您的帮助。

修改

我也试着听http://host:port/configuration/(最后用斜线)。行为没有区别。

1 个答案:

答案 0 :(得分:1)

我还没有弄乱OWIN自托管的东西,但我的猜测是它正在监听你提供的URI,但仍然传递整个网址,即路径路线选择与您提供的URI无关。

我会从

更改您的属性路线
[Route("~/")]

[Route("~/{resourceName}")]

[Route("configuration")]

[Route("configuration/{resourceName}")]

或使用

的路由前缀
[RoutePrefix("configuration")]