路由配置一般是有两个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”)] 标签控制显示的url,而不受WebApiConfig限制,修改了testController如下:
[Route ("room/fetch")]
public HttpResponseMessage Get()
{
AppHttpResponse r = new AppHttpResponse();
r.Data = "from server";
r.Message = "success";
return toJson(r);
}
这样需要通过浏览器这样访问:
如果还想对这个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);
}
那么浏览器需要这样访问: