asp.net _路由配置

路由配置一般是有两个RouteConfig、WebApiConfig。

RouteConfig

RouteConfig一般是影响页面Controller,如下:

  public class RouteConfig
    {
        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 }
            );
        }
    }

defaults: new { controller = “Home”, action = “Index”, id = UrlParameter.Optional },说明访问ip+端口,会默认跳到Home页面,Optional 意思是可选,如下:
在这里插入图片描述
如果我们制定controller跟action,也是一样可以访问到Home页面,如下:

在这里插入图片描述

WebApiConfig

WebApiConfig是影响web api相关的ApiController:

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务
            // 将 Web API 配置为仅使用不记名令牌身份验证。
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            )
        }
    }

routeTemplate: “api/{controller}/{id}”,说明api请求路径规则是,ip+port+api+controller+id(可选),比如创建testController:

public class testController : ApiController
  {      
      // GET: api/test
      public HttpResponseMessage Get()
      {
          AppHttpResponse r = new AppHttpResponse();
          r.Data = "from server";
          r.Message = "success";      
          return toJson(r);
      }

      // GET: api/test/5
      public string Get(int id)
      {
          return "value";
      }

      // POST: api/test
      public void Post([FromBody]string value)
      {
      }

      // PUT: api/test/5
      public void Put(int id, [FromBody]string value)
      {
      }

      // DELETE: api/test/5
      public void Delete(int id)
      {
      }

      public static HttpResponseMessage toJson(Object obj)
      {
          String str;
          if (obj is String || obj is Char)
          {
              str = obj.ToString();
          }
          else
          {        
              JavaScriptSerializer serializer = new JavaScriptSerializer();
              str = serializer.Serialize(obj);
          }
          HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
          return result;
      }
  }

接口访问如下:
在这里插入图片描述
如果WebApiConfig改成这样:

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务
            // 将 Web API 配置为仅使用不记名令牌身份验证。
            config.SuppressDefaultHostAuthentication();
            config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

            // Web API 路由
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/mobile/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            )
        }
    }

浏览器就需要这样访问了:
在这里插入图片描述

一些相关的标签介绍:

路由特性[Route (“api url”)]

添加了特性路由后,只能通过特性路由的路径访问,而不受WebApiConfig限制
1.路由特性无参数
修改了testController如下:

      [Route ("room/fetch")]
        public HttpResponseMessage Get()
        {
            AppHttpResponse r = new AppHttpResponse();
            r.Data = "from server";
            r.Message = "success";
            return toJson(r);
        }

这样需要通过浏览器这样访问:
在这里插入图片描述

2.路由特性方法有参数

  [Route("room/fetch/{id}")]
        public string GetListData0(int id)
        {
            return "value";
        }

在这里插入图片描述

3.路由特性方法有参数有默认值

[Route("room/fetch/{id:int=6}")]
        public string GetListData1(int id)
        {
            return "value";
        }

在这里插入图片描述

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

 [Route("room/fetch/{id:int=6}/fetch")]
        public string GetListData3(int id)
        {
            return "value";
        }

在这里插入图片描述

路由前缀[RoutePrefix(“api url”)]

如果还想对这个controller的所有接口加上默认前缀,可以这样做:

 [RoutePrefix("api/test")]
    public class testController : ApiController
    {
        private static readonly ILog loginfo = LogManager.GetLogger("loginfo");
        // GET: api/test
        [Route ("room/fetch")]
        public HttpResponseMessage Get()
        {
            AppHttpResponse r = new AppHttpResponse();
            r.Data = "from server";
            r.Message = "success";   
            return toJson(r);
        }

那么浏览器需要这样访问:
在这里插入图片描述

指定Action名称[ActionName(“ActionName”)]
       [ActionName("GetData")]   
        public HttpResponseMessage Get()
        {
            AppHttpResponse r = new AppHttpResponse();
            r.Data = "from server";
            r.Message = "success";       
            return toJson(r);
        }

访问缺出现了以下问题:

The parameters dictionary contains a null entry for parameter ‘id’ of non-nullable type ‘System.Int32’ for method ‘System.String Get(Int32)’ in ‘web.Controllers.testController’. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

在这里插入图片描述
原因是:指定了ActionName后,默认是Get请求,controller下面包含 Get(int id),会以这个去匹配参数。解决方法是把 Get(int id)注释掉。
在这里插入图片描述

指定请求方式:[HttpGet]、[HttpPost]

[HttpGet]指定是Get请求,[HttpPost]指定是post请求

Get请求把参数写到url里面:

        [HttpGet]
        [Route("api/Records")]
        public List<FaceRecord> Get([FromUri] int day)
        {           
        }
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值