asp.net WEB API:路由 - 控制器之前的动作。可能的解决方法?

时间:2014-02-14 15:29:16

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

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

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

国家/地区是控制器,并且在返回不同结果之前依赖于参数。


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

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

CountriesController:

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

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

任何sugestions? 修改 我有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

2 个答案:

答案 0 :(得分:0)

首先请允许我说,如果“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引入了一些名为路由属性的东西,它们可以与您的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 };
   }
...

答案 1 :(得分:-1)

感谢Dalorzo回答我确实发现了问题:

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

Creating my new app

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

Both Files

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

放完代码后

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

WebApiConfig.cs 中,正常工作