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

本文关键字:意外 Web 路由 API 结尾 URL | 更新日期: 2023-09-27 18:32:48

我正在使用 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;
    }

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

如果我向http://host:port/configuration发出GET请求(末尾没有正斜杠),它会调用GetResource()并返回"资源配置"。我希望它能GetResourceList()电话.

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

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

感谢您的帮助。

编辑

我也只是尝试收听http://host:port/configuration/(末尾有一个斜杠)。行为没有差异。

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

我没有

弄乱 OWIN 自托管的东西,但我的猜测是它正在侦听您提供的 URI,但仍传入整个 URL,即路由拾取的路径不相对于您提供的 URI。

我会将您的属性路由从

[Route("~/")]

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

[Route("configuration")]

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

或使用路由前缀

[RoutePrefix("configuration")]