【问题标题】:asp.net WEB API: Routing - Action before Controller. Possible workaround?asp.net WEB API:路由 - 控制器之前的操作。可能的解决方法?
【发布时间】:2014-03-14 01:04:14
【问题描述】:

我正在使用 asp.net 开发一个 WEB API,我的目标是能够调用这种类型的 url:

/html/countries/...
/json/countries/...

Countries 是一个控制器,根据参数返回不同的结果。


我做了什么,但它似乎不起作用:

       routes.MapRoute(
            name: "Default",
            url: "api/{action}/{controller}",
            defaults: new
            {
            }
        );

CountriesController:

    [ActionName("html")]
    public string get()
    {
        //...
    }

    [ActionName("json")]
    public void getType()
    {
        //...
    }

有什么建议吗? 编辑: 我有 7 个控制器。

还有一些可能的网址:

/html/{controller}/x/y
/json/{controller}/x/y/order/h
/html/{controller}/x/z/order/y/j
/json/{controller}/x/z/order/y/j

【问题讨论】:

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


    【解决方案1】:

    首先请允许我说,如果“html”或 json 操作意味着“格式”,它们不应该是您的控制器的一部分,它们是媒体类型,需要进行不同的配置

    Web Api v1 在 application_start 事件的 global.asax 中全局定义资源。假设您使用 Visual Studio 2013 和基于 Microsoft 默认模板,您的方法可能如下所示:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    

    WebApi 路由配置发生在这里 WebApiConfig.Register 而你的 MVC 配置发生在这里 RouteConfig.RegisterRoutes

    您的 WebApi 路由配置应如下所示

    public static class WebApiConfig{
            public static void Register(HttpConfiguration config){            
                config.Routes.MapHttpRoute(
                    name: "htmltApi",
                    routeTemplate: "html/{action}/{controller}",
                );
    
                config.Routes.MapHttpRoute(
                    name: "jsonApi",
                    routeTemplate: "json/{action}/{controller}",
                );
         ...
    

    另一个重要的细节是,WebApi v2 引入了称为 Route Attributes 的东西,它们可以与 Controller 类一起使用,并且可以促进路由配置。

    例如:

     public class BookController : ApiController{
         //where author is a letter(a-Z) with a minimum of 5 character and 10 max.      
        [Route("html/{id}/{newAuthor:alpha:length(5,10)}")]
        public Book Get(int id, string newAuthor){
            return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
        }
    
       [Route("json/{id}/{newAuthor:alpha:length(5,10)}/{title}")]
       public Book Get(int id, string newAuthor, string title){
           return new Book() { Title = "SQL Server 2012 id= " + id, Author = "Adrian & " + newAuthor };
       }
    ...
    

    【讨论】:

      【解决方案2】:

      感谢 Dalorzo 的回答,我确实找到了问题:

      出现问题是因为我的应用程序是按以下方式创建的:

      这导致创建了两个文件,RouteConfig.cs (MVC) 和 WebApiConfig.cs (WEB API):

      错误是问题中的代码来自RouteConfig.cs

      放代码后

             config.Routes.MapHttpRoute(
                  name: "Default",
                  routeTemplate: "api/{action}/{controller}",
                  defaults: new
                  {
                      action = "html"
                  }
              );
      

      WebApiConfig.cs 中,它工作正确。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        相关资源
        最近更新 更多