【问题标题】:WebApi Routing - map url to apiWebApi 路由 - 将 url 映射到 api
【发布时间】:2014-01-13 02:33:43
【问题描述】:

我已经在谷歌上搜索了大约一个小时,但没有找到示例,所以我想我会在这里问。

我正在用 webapi 替换标准 mvc 控制器,并且路由出现问题,由于组织原因,我已更改名称,但它们仍然有效。

我的 webapi 当前在控制器文件夹中被称为 SystemAPI - 我希望它具有与理想情况下指向它的 url 不同的名称。

我需要指向它的 url 是 /v1Controller/{id} 我无法更改 v1Controller url,因为它是我无法控制的应用程序的固定点

我目前的编码尝试是

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DocumobiApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

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

        // Uncomment the following line of code to enable query support for actions with an IQueryable or IQueryable<T> return type.
        // To avoid processing unexpected or malicious queries, use the validation settings on QueryableAttribute to validate incoming queries.
        // For more information, visit http://go.microsoft.com/fwlink/?LinkId=279712.
        //config.EnableQuerySupport();

        var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().FirstOrDefault();
        jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    }
}

我得到了回应

"message":"No HTTP resource was found that matches the request URI 'http://localhost:38685/v1Controller'.","messageDetail":"No route providing a controller name was found to match request URI 'http://localhost:38685/v1Controller'"}

我确信它是相当明显的,但我一辈子都无法弄清楚。

干杯,

史蒂文

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api


    【解决方案1】:

    如以下错误消息所述,路由匹配应导致为 controller 路由变量提供值,Web API 依赖该变量选择控制器。

    No route providing a controller name was found to match request URI 'http://localhost:38685/v1Controller
    

    所以你可以像下面这样修改路由(注意controller变量的默认值):

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

    【讨论】:

    • 谢谢基兰!对我来说是一种享受,我用我想要击中的实际控制器的名称替换了你的文本。我也意识到你不需要包含单词控制器:-)
    【解决方案2】:

    确保控制器上的操作方法具有默认值的 id。

    【讨论】:

      猜你喜欢
      • 2019-03-29
      • 2016-08-08
      • 2012-11-23
      • 2016-07-16
      • 2023-03-27
      • 2012-11-05
      • 2015-06-19
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多