路由配置一般是有两个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)
{
}