webapiconfig自定义路由_net webapi 多路由 webapiconfig - CSDN
精华内容
参与话题
  • WebApi路由机制详解——看完不会用你打我

    万次阅读 多人点赞 2020-10-11 17:15:02
    随着前后端分离的大热,WebApi在项目中的作用也是越来越重要,由于公司的原因我之前一直没有...从MVC到WebApi,路由机制一直都在其中扮演着重要的角色。 它可以很简单:如果你只需要会用一些简单的路由,如/Home...

    随着前后端分离的大热,WebApi在项目中的作用也是越来越重要,由于公司的原因我之前一直没有机会参与前后端分离的项目,但WebApi还是要学的呀,因为这东西确实很有用,可单独部署、与前端和App交互都很方便,既然有良好的发展趋势,我们当然应该顺势而为——搞懂WebApi!Restful相当于给Http请求增加了语义,Post(增)、Delete(删)、Put(改)、Get(查),有时会用Get进行查询,用Post进行增、删、改。

    从MVC到WebApi,路由机制一直都在其中扮演着重要的角色。

    它可以很简单:如果你只需要会用一些简单的路由,如/Home/Index那么你只需要配置一个默认路由就能搞定。

    它可以很神秘:你的url可以千变万化,看到一些“无厘头”的url,很难理解它是如何找到匹配的Action,例如/api/Pleasure/1/detail,这样的url可以让你纠结半天。

    它可以很深奥:当面试官提问“请简单分析下MVC路由机制的原理”,你可能事先就准备好了答案,然后劈里啪啦一顿(型如:UrlRoutingMoudle—>Routes—>RouteData—>RequestContext—>Controller),你可能回答的很流利,但并不一定理解这些个对象到底是啥意思。):目前为止我还没能理解透,以后会继续努力的直到弄清楚。

    一、MVC和WebApi路由机制比较

    1、MVC使用的路由

    在MVC中,默认路由机制是通过解析url路径来匹配Action。比如:/User/GetList,这个url就表示匹配User控制器下的GetList方法,这是MVC路由的默认解析方式。为什么默认的解析方式是这样子的呢?因为MVC定义了一个默认路由,路由代码放在App_Start文件夹下的RouteConfig.cs中,今后我们如果想要自定义路由规则,那自定义路由的代码也要写在RouteConfig.cs中。

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }

    url:"{controller}/{action}/{id}"定义了路由解析规则,{controller}是必填参数默认值是Home,{action}是必填参数默认值是Index,{id}表示匹配名称为id的形参,而且是可选参数(方法的参数列表中可以有名为id的形参,也可以没有)。

    2、WebApi使用的路由

    在WebApi中,默认路由机制是通过解析http请求的类型来匹配Action,也就是说WebApi的默认路由机制不需要指定Action的名称。比如:/api/Pleasure,这个url就表示匹配Pleasure控制器下的[HttpGet]方法,/api是固定必填值,这是WebApi路由的默认解析方式。WebApi的默认解析方式之所以如此,同样也是因为定义了默认路由,路由代码放在App_Start文件夹下的WebApiConfig.cs中,今后我们如果想要自定义路由规则,那自定义路由的代码也要写在WebApiConfig.cs中。

    public static void Register(HttpConfiguration config)
    {
        // Web API 路由
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    
    }

    routeTemplate:"api/{controller}/{id}"定义了路由解析规则,api是固定必填值,{controller}是必填参数无默认值,{id}表示匹配名称为id的形参,而且是可选参数(方法的参数列表中可以有名为id的形参,也可以没有)。

    3、MVC和WebApi路由区别汇总

    • WebApi的默认路由机制通过http请求的类型匹配Action,MVC的默认路由机制通过url匹配Action
    • WebApi的路由配置文件是WebApiConfig.cs,MVC的路由配置文件是RouteConfig.cs
    • WebApi的Controller继承自Web.Http.ApiController,MVC的Controller继承自Web.Mvc.Controller

    4、示例一

    public class PleasureController : ApiController
    {
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "value1", "value2" };
        }
    }

     
    为什么http://localhost:7866/api/Pleasure能匹配到GetOne()方法呢?首先根据路由规则解析出控制器是Pleasure,其次通过浏览器地址栏直接发出的请求都是get请求而Pleasure中只有一个get类型的方法,因此就匹配到了GetOne()。


    为什么http://localhost:7866/api/Pleasure/1也能匹配到GetOne()方法呢?因为id是可选形参,即使指定了id的值,也可以访问不含形参id的方法。

    5、示例二

    public class PleasureController : ApiController
    {
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "value1", "value2" };
        }
    
        [HttpGet]
        public IEnumerable<string> GetOne(int id)
        {
            return new string[] { "含参-value1", "含参-value2" };
        }
    }


    示例二中http://localhost:7866/api/Pleasure请求的结果与示例一中的结果是一样的,在此不做过多的解释。

    示例二中http://localhost:7866/api/Pleasure/1请求到了含参方法,说明如果指定了形参id的值,而且Controller中存在指定请求类型的含参方法,会优先匹配含此形参的方法。若匹配不上含参方法,但参数类型为可选参数,那就再尝试匹配不含此形参的方法。

    6、示例三

    public class PleasureController : ApiController
    {
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "value1", "value2" };
        }
    
        [HttpGet]
        public IEnumerable<string> GetOne(int id)
        {
            return new string[] { "含参-value1", "含参-value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "value";
        }
    }


    虽然WebApi的默认路由机制不需要指定Action,但是WebApi支持在url中指定Action。由于Restful风格的服务要求请求的url中不能包含Action,因此WebApi不提倡在url中指定Action。

    7、示例四

    public class PleasureController : ApiController
    {
        [HttpGet]
        public string GetOne(int id,string name,int age)
        {
            return string.Format("id={0},name={1},age={2}", id, name, age);
        }
    }

     

    二、WebApi基础

    1、默认路由

    新建WebApi服务的时候,会自动在WebApiConfig.cs文件里面生成一个默认路由:

    public static void Register(HttpConfiguration config)
    {
        // Web API 路由
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

    将MapHttpRoute()方法转到定义可以发现,它有四个重载方法:

    下面来看看各个参数的作用:

    • name:"DefaultApi"表示此路由的名称。注册多个路由时必须保证名称不重复。
    • routeTemplate:"api/{controller}/{id}"表示路由的匹配规则。api是固定必填值,这个值是可变的如果你把它改成“BalaApi”,那url就应该变成 “http://1.1.1.1:80/BalaApi/***”。{controller}是控制器的占位符,在真实的url中,该部分对应的是具体的控制器名称,这个和MVC一致。{id}是形参id的占位符,id是形参的名字,一般这个参数都会在defaults中设置为可选。
    • defaults:new { id=RouteParameter.Optional }表示设置id为可选参数,routeTemplate中的{controller}和{id}都可以设置默认值。若defaults改成new { controller="Pleasure", id = RouteParameter.Optional },那么我们请求http://1.1.1.1:80/api这个url仍然能访问到Pleasure控制器中的[HttpGet]方法。
    • constraints:new{ id = @"\d+" }表示为id添加约束。形参id不能为空而且必须是整数,优先匹配含参方法,也能匹配无参方法(详情请回看上一部分的示例一)。
    public class PleasureController : ApiController
    {
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "value1", "value2" };
        }
    
        [HttpGet]
        public IEnumerable<string> GetOne(int id)
        {
            return new string[] { "含参-value1", "含参-value2" };
        }
    }



     我们如果想在不指定id值的时候仍然能够正常请求到GetOne(),把id的约束改成“constraints: new { id = @"\d*" }”即可,这里就不放截图了,大家可以自己去试试。我们只在路由中对id的值进行了约束,其实我们也可以约束Controller和Action,但一般不常用大家有兴趣可以自己玩一下。

    2、自定义路由

    上面介绍了许多关于默认路由的内容,除此之外我们还可以自定义路由,比如将WebApiConfig.cs改成下面这样:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 路由
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
            config.Routes.MapHttpRoute(
                name: "ActionApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }

    2.1、自定义匹配到Action的路由

    这个自定义路由很好理解,它和MVC中的默认路由大致相同,不同之处是此路由多了个api前缀。
    添加了可匹配到Action的路由后,就能解决“第一部分->示例三”中遇到的问题了。
    当同时存在多个路由时,一定要注意name不能重复。

    public class PleasureController : ApiController
    {
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public IEnumerable<string> GetOne(int id)
        {
            return new string[] { "GetOne(int id)->value1", "GetOne(int id)->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }



    我艹,为什么http://localhost:7866/api/Pleasure/GetOne请求失败了,为什么没有匹配上GetOne()方法?
    下面我来解释下,DefaultApi定义在ActionApi之前,所以先检查http://localhost:7866/api/Pleasure/GetOne能否与DefaultApi匹配成功,api是固定必填值,Pleasure是controller的值,GetOne是id的值,匹配成功!然后去PleasureController中找[HttpGet]类型而且含有string id形参的方法,当然是没有啦。只找到一个[HttpGet]类型的GetOne(int id),所以错误信息中提示参数id的类型不匹配。

    接下来说说解决方法,实际上id是int类型的参数,我们希望GetOne能匹配上ActionApi中的action,而不是DefaultApi中的id,这在默认情况下是做不到的,不过为DefaultApi中的id加上个约束后就能做到了,路由修改后如下:

    public static void Register(HttpConfiguration config)
    {
        // Web API 路由
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"\d*" }
        );
    
        config.Routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

     


    2.2、修改方法的ActionName

    WebApi默认GetOne()方法的ActionName就是GetOne,如果我们想要方法名和ActionName不一致,可以通过ActionName特性来修改。

    public class PleasureController : ApiController
    {
        [ActionName("NewGetOne")]
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public IEnumerable<string> GetOne(int id)
        {
            return new string[] { "GetOne(int id)->value1", "GetOne(int id)->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }


     

    三、WebApi路由执行过程

    1、路由原理

    有了上面的理论作为基础,我们再来分析WebApi路由机制的原理以及路由匹配的过程。由于WebApi的路由机制和MVC有许多相似性,所以要想理解WebApi的路由机制,就需要搬出那些Asp.Net Routing里面的对象。这个过程有点复杂,我就根据搜罗的资料和自己的理解 ,提一些主要的过程:

    a、WebApi服务启动之后,会执行全局配置文件Global.asax.cs的 protected void Application_Start() 方法,其中的 GlobalConfiguration.Configure(WebApiConfig.Register); 会通过委托的方式执行WebApiConfig.cs中的 public static void Register(HttpConfiguration config),将配置的所有路由信息添加到HttpRouteCollection对象中保存起来。这里的HttpRouteCollection对象的实例名是Routes,这个很重要,后面会用到。

    b、当我们发送请求到WebApi服务器的时候,比如当我们访问http://localhost:7866/api/Pleasure时,首先请求会被UrlRoutingModule监听组件截获,然后按照定义顺序检查url能匹配上Routes集合中的哪个路由模板(如果都匹配不上,则返回404),最后返回对应的IHttpRoute对象。IHttpRoute对象是url匹配上的Routes集合里面的一个实体。

    c、将IHttpRoute对象交给当前的请求上下文对象RequestContext处理,根据IHttpRoute对象中的url匹配到对应的controller,然后根据http请求的类型和参数找到对应的action。这样就能找到请求对应的controller和action了。

    这个过程是非常复杂的,为了简化,我只选择了最主要的几个过程。更详细的路由机制可以参考http://www.cnblogs.com/wangiqngpei557/p/3379095.html,这篇文章写得有些深度,感兴趣的朋友可以看下。

    2、根据请求的url匹配路由模板

    通过上文路由过程的分析,我们知道一个请求过来之后,路由主要经历三个阶段:
    1、根据请求的url匹配路由模板
    2、找到controller
    3、找到action

    第一步很简单,主要就是将url与路由模板中配置的routeTemplate进行匹配校验,在此不做过多的说明。

    3、找到controller

    你如果反编译路由模块的代码,就会发现控制器的选择主要在IHttpControllerSelector接口中的SelectController()方法里面处理。

    该方法所需的HttpRequestMessag参数,是由当前请求封装而来,返回HttpControllerDescriptor对象。这个接口默认由DefaultHttpControllerSelector类提供实现。

    默认实现的方法里面大致的算法机制是:首先在路由字典中找到实际的控制器名称(比如“Pleasure”),然后在此控制器名称后面加上“Controller”字符串得到控制器的全称“PleasureController”,最后找到WebApi对应的Controller再实例化就得到当前请求的控制器对象。
     

    4、找到action

    得到了控制器对象之后,Api引擎通过调用IHttpActionSelector接口中的SelectAction()方法去匹配action。这个过程主要包括:

    • 解析当前http请求,得到请求类型(post、delete、put、get)
    • 如果路由模板配置了{action},则直接去url中找action的名称
    • 解析请求的参数

    如果路由模板配置了{action},那么直接去url中找对应的action即可。如果没有配置action,则会首先匹配请求类型(post/delete/put/get),然后匹配请求参数,才能找到对应的action。
     

    5、设置方法同时支持多种http请求类型

    WebApi提供了AcceptVerbs,应用这一特性可以使方法同时支持多种请求类型。这一特性在实际中使用不是太多,大家了解即可。

    [AcceptVerbs("get","post")]
    public string GetList()
    {
        return "GetList()->value";
    }

    四、WebApi特性路由

    如果http请求的类型相同(比如都是get请求),并且请求的参数也相同。这个时候似乎就有点不太好办了,这种情况在实际项目中还是比较多的,比如:

    public class PleasureController : ApiController
    {
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }

     当然这个问题可以通过添加匹配到Action的路由来解决,不过这就不符合Restful风格了,所有我们不提倡这种写法。除此之外,利用特性路由也能解决上述问题,下面说说特性路由的东西。

    1、启动特性路由

    public static void Register(HttpConfiguration config)
    {
        //启动特性路由
        config.MapHttpAttributeRoutes();
    
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: new { id = @"\d*" }
        );
    
        config.Routes.MapHttpRoute(
            name: "ActionApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }

    一般情况下通过新版本的VS2017创建WebApi项目时,这句话默认已经存在。

    2、最简单的无参特性路由


    2.1、为GetOne()方法添加Route特性(特性路由没参数,GetOne()方法也没参数)

    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne")]
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }




    结论:

    • 为GetOne()添加了特性路由后,无法通过WebApi默认路由机制(不指定Action)访问GetOne()
    • 为GetOne()添加了特性路由后,无法通过指定ActionName的方式访问GetOne()
    • 为GetOne()添加了特性路由后,只能通过特性路由的路径访问GetOne()

    2.2、为GetOne()方法添加Route特性(特性路由没参数,GetOne()方法有参数)

    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne")]
        [HttpGet]
        public IEnumerable<string> GetOne(int age)
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }

    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne")]
        [HttpGet]
        public IEnumerable<string> GetOne(string name)
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }



    特性路由不含参数时的结论:

    • 方法没参数时,只要url满足特性路由的定义就能访问到方法
    • 方法有参数时,必须url满足特性路由的规则而且指定了方法所需的参数值才能访问到方法

    3、含参特性路由

    3.1、特性路由有参数,方法没参数

    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne/{name}")]
        [HttpGet]
        public IEnumerable<string> GetOne()
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }



    3.2、特性路由有参数,方法有参数

    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne/{name}")]
        [HttpGet]
        public IEnumerable<string> GetOne(string name)
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }


     

    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne/{name}")]
        [HttpGet]
        public IEnumerable<string> GetOne(string address)
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }



     

    特性路由含参数时的结论:

    • 方法没参数时,只要url满足特性路由的定义就能访问到方法
    • 方法有参数时,必须url满足特性路由的规则而且指定了方法所需的参数值才能访问到方法

    3.3、特性路由有参数,参数在最后而且有默认值

    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne/{age:int=16}")]
        [HttpGet]
        public IEnumerable<string> GetOne(int age)
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }



    3.4、特性路由有参数,参数在中间而且有默认值

    public class PleasureController : ApiController
    {
        [Route("Pleasure/{age:int=16}/GetOne")]
        [HttpGet]
        public IEnumerable<string> GetOne(int age)
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }




    4、路由前缀

    在正式项目中,同一个控制器中所有的action的特性路由最好有一个相同的前缀,这并非是必须的,但能增加url的可读性。一般的做法是在控制器上使用[RoutePrefix]特性来标识。当我们使用特性路由来访问时,前边必须加上定义的前缀。

    [RoutePrefix("api/prefix")]
    public class PleasureController : ApiController
    {
        [Route("Pleasure/GetOne/{age:int=16}")]
        [HttpGet]
        public IEnumerable<string> GetOne(int age)
        {
            return new string[] { "GetOne()->value1", "GetOne()->value2" };
        }
    
        [HttpGet]
        public string GetList()
        {
            return "GetList()->value";
        }
    }


    五、总结

    整理这篇文章真是不太容易,如果这篇文章对你有帮助,请点赞、评论支持下。

    特别感谢https://www.cnblogs.com/landeanfen/p/5501490.html,本文的创作灵感来自上述参考,我对其中的内容进行了整理和扩展,感谢博主的无私分享。

    展开全文
  • 1 public class ValuesController : ApiController { // GET api/values public IEnumerable Get() { return new string[] { "value1", "value2" ,"... // GET api/values/5

    WebAPI可以通过[Route]和[RoutePrefix]来自定义路由,[RoutePrefix]作用于Controller,[Route]作用于Action

    Route  与 RoutePrefix的用法

    namespace WebApi.Controllers
    {
        //注意:RoutePrefix是搭配Route来使用的。单独在控制器类上标注RoutePrefix是不起作用的
        [RoutePrefix("api/MyHome")] 
        public class HomeController : ApiController
        {
            [Route("GetString")]  //我们也可以不在控制器上标注RoutePrefix 只要这样写就可以[Route("api/MyHome/GetString")] 
            public string GetString(string username)
            {
                return "你输入的是:" + username;
            }
        }
    
        //解释说明:如果我们在控制器上标注了[RoutePrefix("api/MyHome")]  同时又在控制器的方法上标注了 [Route("GetString")]
        //          那么这个方法的访问地址就是 http://localhost:14483/api/MyHome/GetString?username=tom 
        //假如我们没有在控制器方法上标注[RoutePrefix("api/MyHome")] 而是仅仅在控制器方法上标注了[Route("GetString")]
        //          那么这个方法的访问地址就是 http://localhost:14483/GetString?username=tom
    
        //注意:RoutePrefix仅仅是用来修饰Route路由的前缀的。可有可无。真正起路由作用的是打在控制器方法上的Route
        //打个比方:假如控制器中有100个方法都需要打上[Route("api/MyHome/GetBy....")]标注 为了省事 我就在控制器类上标注
        //[RoutePrefix("api/MyHome")] 这样控制器中的100个方法只要标注[Route("GetBy....")] 就可以了。省了点代码量而已
    
        //当我们在控制器方法上标注了[Route]那么我们在WebApiConfig.cs配置类中配置的routeTemplate路由模板就不起作用了
    }

    RoutePrefix 和Route搭配使用(当然只用Route也行)的第二种作用是从url捕获参数(无论get、post等都可以)

    例如:

    namespace WebApi.Controllers
    {
        //注意:RoutePrefix是搭配Route来使用的。单独在控制器类上标注RoutePrefix是不起作用的
        [RoutePrefix("api/MyHome")]
        public class HomeController : ApiController
        {
    		[HttpGet] //Get方法可以请求
            [HttpPost] //Post也可以请求
            [Route("Login/{name}/{password}")]
            public bool Login(string name, string password)//通过Get请求和Post请求,name的值为admin,password的参数是123456
            {
                return (name == "admin" && password == "123456");
            }
        } 
    }

    Get请求地址: http://localhost:14483/api/MyHome/Login/admin/123456

    Post请求地址:http://localhost:14483/api/MyHome/Login/admin/123456 

    我们发现 这样一搞,就可以将 name 参数和password参数都可以用url地址的形式映射到方法参数里面

    public class HomeController : Controller
    {      
        public async Task<ActionResult> Index()
        {
            HttpClient hc = new HttpClient();
    
            Dictionary<string, string> kv = new Dictionary<string, string>();
            //kv["name"] = "admin";   
            //kv["password"] = "123456";  //这里不传值,而是直接在请URL地址中将值传过去
    
            FormUrlEncodedContent content = new FormUrlEncodedContent(kv);
            var task = await hc.PostAsync("http://localhost:14483/api/MyHome/Login/admin/123456", content);
            var result = await task.Content.ReadAsStringAsync();
            return View();
        }
    }


    展开全文
  • MVC WebApi 路由设置(自定义) 分区Area

    万次阅读 2016-10-31 17:51:15
    而在新建一个WebApi项目时会自动生成WebApiConfig.cs 文件,该文件里是对api控制器设置的路由: 默认是有一个路由 , 后面的是自己新加的,这里的name就相当于一个路径名,访问时如下操作: 这里可以看到 ,我们...

    用过MVC的都知道,它的默认路由设置是在App_Start 下的RouteConfig里:


    而在新建一个WebApi项目时会自动生成WebApiConfig.cs 文件,该文件里是对api控制器设置的路由:


    默认是有一个路由 , 后面的是自己新加的,这里的name就相当于一个路径名,访问时如下操作:


    这里可以看到 ,我们首先访问的是前面默认的API,下面我们继续访问自定义的API:


    调用的方法是一个,访问的API路径不一样也可以得出一样的数据。

    The  End.


    展开全文
  • ASP.NET WebApi 路由配置

    千次阅读 2017-11-27 14:57:01
    一、模板路由1、在App_Start文件夹下面的WebApiConfig,默认路由配置为:using System; using System.Collections.Generic; using System.Linq; using System.Web.Http;namespace testAPI { public static class ...

    WebApi相关文章:

    一、模板路由

    1、在App_Start文件夹下面的WebApiConfig,默认路由配置为:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Http;
    
    namespace testAPI
    {
        public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
                config.EnableSystemDiagnosticsTracing();
            }
        }
    }
    

    url:api/{controller}/{id}

    2、在控制器里面添加一个get请求:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    
    namespace testAPI.Controllers
    {
        public class ValuesController : ApiController
        {
            [HttpGet]
            public string Get1()
            {
                return "value1";
            }
        }
    }

    3、启动项目,浏览器测试:
    这里写图片描述
    可以看到通过get请求获取到了数据

    4、在控制器里面再添加一个get请求:

    public class ValuesController : ApiController
        {
            [HttpGet]
            public string Get1()
            {
                return "value1";
            }
    
            public string Get2()
            {
                return "value2";
            }
    
    
        }

    启动项目,浏览器测试:
    这里写图片描述

    我们发现发生错误:找到了与该请求匹配的多个操作
    那要怎么处理呢,把第二个方法改成post请求:

    public class ValuesController : ApiController
        {
            [HttpGet]
            public string Get1()
            {
                return "value1";
            }
            [HttpPost]
            public string Get2()
            {
                return "value2";
            }
        }

    测试请求:
    这里写图片描述
    可以正确获取到数据,且如果是post请求返回Get2的信息,如果是get请求返回Get1的信息;

    从上面两个测试我们可以得出如下结论:
    当多个action的 请求方式一样的话,在默认路由模板下(没有action),将会匹配多个操作。 基于上面两点结论,默认路由模板无法满足针对一种资源一种请求方式的多种操作。

    5、自定义一个路由:

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
                //自定义路由:匹配到action
                config.Routes.MapHttpRoute(
                    name: "ActionApi",
                    routeTemplate: "actionapi/{controller}/{action}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
                config.EnableSystemDiagnosticsTracing();
            }
        }

    控制器方法:

     public class ValuesController : ApiController
        {
            public string Get1()
            {
                return "value1";
            }
            public string Get2()
            {
                return "value2";
            }
        }

    测试:
    这里写图片描述
    这里写图片描述
    这里写图片描述
    请求http://localhost:26753/actionapi/values返回404错误;
    请求http://localhost:26753/actionapi/values/get1返回Get1的信息;
    请求http://localhost:26753/actionapi/values/get2返回Get2的信息;

    通过定制路由模板我们可以得出如下结论:
    通过在路由模板中增加action目录,对资源的定位直接作用到action上。 多个HttpGet方法可以共存于一个controller中。

    二、特性路由

    特性路由主要处理一些比较复杂的请求url,如资源之间存在嵌套关系:客户包含订单,书有作者属性等等。对于这种Uri,我们希望的路由是这样的:/costomers/{customerid}/orders 或 /costomers/{customerid}/orders/{orderid}

    考虑到这只是某个Controller的路由格式,而我们会有很多个Controller,用基于约定路由显然不合适(要配置很多的路由)

    使用特性路由就简单了,在action上加一个特性即可

    [Route("customers/{productId}/orders")]
    public string getProductName(int productId)
    {
        return "name";
    }

    使用特性路由需要在WebApiConfig中添加config.MapHttpAttributeRoutes();

    public static class WebApiConfig
        {
            public static void Register(HttpConfiguration config)
            {
                config.MapHttpAttributeRoutes();
                ...
            }
        }
    展开全文
  • WebApi(三)-属性路由 自定义访问路径

    千次阅读 2019-01-24 11:07:47
    WebApi(三)-属性路由 自定义访问路径 启用属性路由: 1.在WebApiConfig中加入如下代码: //属性路由 config.MapHttpAttributeRoutes(); 2.在Global.asax.cs里修改WebApiConfig.Register...
  • Asp.net Web Api开发(第一篇) 自定义HTTP消息拦截器,实现统一消息拦截,Token验证,签名验证等。
  • ASP.Net Web API 中基于属性的路由使用

    千次阅读 2015-03-23 13:15:53
    原文地址:...这种方法解决了大多数基本的路由问题,但是它将自定义路由的细粒度的控制和灵活性进行限制。属性基于路由是最受欢迎的
  • MVC——WebApi(学习之路1)

    千次阅读 2018-10-15 15:11:05
    一、MVC和WebApi路由机制比较 ...在MVC里面,默认路由机制是通过url路径去匹配对应的action方法,比如/Home/GetUser这个url,就表示匹配Home这个Controller下面的GetUser方法,这个很好理解,因为在MVC里面...
  • Asp.net Web Api开发(第三篇)自定义异常过滤器
  • ASP.NET Web API的版本化与安全性

    千次阅读 2015-08-07 14:51:18
    使用Web API来构建Web 服务,是一件非常容易的事情。Web API使用Http协议, 具备良好的可访问性,尤其适于部署到internet.  作为服务,就有一个版本化和安全性的问题。
  • ASP.NET Web API实现缓存的2种方式

    千次阅读 2016-09-13 21:27:52
    在ASP.NET Web API中实现缓存大致有2种思路。一种是通过ETag, 一种是通过类似ASP.NET MVC中的OutputCache。 通过ETag实现缓存 首先安装cachecow....在WebApiConfig中。 public static class WebApiConfig {
  • webapi Route 特性

    千次阅读 2017-04-01 10:17:58
    ASP.NET Web API路由,简单来说,就是把客户端请求映射到对应的Action上的过程。在"ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置"一文中,体验了通过模版、惯例、HTTP方法来设置路由,这种做法的好处是...
  • WebApi使用自定义路由与BaseController

    千次阅读 2018-04-27 15:21:25
    新建一个BaseController,继承自ApiController public abstract class BaseController&lt;T&gt; : ApiController where T : class, IApiModel { [HttpPost] [Route(""... I...
  • WebApi特性路由路由前缀

    千次阅读 2017-07-02 23:01:00
    特性路由 WebApi2默认的路由规则我们称作基于约定路由,很多时候我们使用RESTful风格的URI.简单的路由是没问题的,如 api/Products/{id},但有些事很难处理的,如资源之间存在嵌套关系:客户包含订单,书有作者...
  • C# 搭建一个简单的WebApi项目

    万次阅读 多人点赞 2018-12-21 18:10:45
    一、创建Web API1、创建一个新的web API项目启动VS 2013,并在“开始页”选择“新项目”。或从“文件”菜单选择“新建”,然后选择“项目”。在“模板”面板中选择“已安装模板”,并展开“Visual C#”节点。...
  • 随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中。我们有必要先说一下ASP.NET Core。 ASP.NET Core 是新一代的 ASP.NET,第一次出现时的代号为 ASP.NET ...
  • 路由是指Web API如何匹配到具体的动作。Web API 2支持一个新的路由类型,它被称为属性路由。正如其名,属性路由使用属性来定义路由。属性路由给予你在web API的URI上的更多控制。例如,你能轻易的创建用于描述层级...
  • Web API配置自定义路由

    2019-01-03 19:51:43
    默认访问Web API时,是无需指定method名。它会按照默认的路由来访问。如果你的Web API中出现有方法重载时,也许得...标记1为自定义路由,标记2为默认路由,需要把自定义路由排在前面。系统会先从自定义路由去匹配。...
  • 前言 刚开始创建MVC与Web API的混合项目时,碰到好多...问题大概有以下几点: 1、项目层的文件夹结构 2、解决MVC的Controller和Web API的Controller类名不能相同的问题 3、给MVC不同命名空间的Area的注册不同的路由 4
  • Web Api 的 路由机制

    千次阅读 2017-05-11 13:37:34
    ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的...所以我们要想学习web api 就要去了解它的路由机制。MVC和web api的路由机制的主要区别是web api 使用的是http 方法而不是url 的路径。本
1 2 3 4 5 ... 20
收藏数 636
精华内容 254
关键字:

webapiconfig自定义路由