WebAPI HelpPage支持area
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebAPI HelpPage支持area相关的知识,希望对你有一定的参考价值。
开篇:对于WebApi研究不是很深,刚开始使用,记录自己的解决思路,有更好的处理方式或发现我对WebApi理解有不对的地方恳请指正,谢谢!
环境:WebAPI服务、HelpPage,API路由:“api/{controller}/{action}”,服务与helpPage运行正常,帮助文档页面所有API地址遵循路由格式
问题描述:当两个area下出现同名的controller/action时,生成的帮助文档页面API地址会一模一样,请求出错
解决思路:将路由定义为“api/{area}/{controller}/{action}”,已区分不同的area,但测试后发现HelpPage页面生成的API地址中“{area}”部分无法替换为正确的名称,尝试良久,终于解决,将解决过程列出如下:
1.WebApiConfig 修改api路由如下
1 config.Routes.MapHttpRoute(
2 name: "DefaultApi",
3 routeTemplate: "api/{area}/{controller}/{action}/{id}",
4 defaults: new { id = RouteParameter.Optional }
5 );
2.修改helpPage下的ApiDescriptionExtensions,在GetFriendlyId中加入如下处理
1 public static string GetFriendlyId(this ApiDescription description)
2 {
3 //获取controller的fullname
4 string controllerFullName = description.ActionDescriptor.ControllerDescriptor.ControllerType.FullName;
5 //匹配areaName
6 string areaName = Regex.Match(controllerFullName, @"Area.([^,]+)\.C").Groups[1].ToString().Replace(".","");
7 if (string.IsNullOrEmpty(areaName))
8 {
9 //若不是areas下的controller,将路由格式中的{area}去掉
10 description.RelativePath = description.RelativePath.Replace("{area}/", "");
11 }
12 else
13 {
14 //若是areas下的controller,将路由格式中的{area}替换为真实areaname
15 description.RelativePath = description.RelativePath.Replace("{area}", areaName);
16 }
17 }
3.HelpController下的API action调整
1 public ActionResult Api(string apiId)
2 {
3 if (!String.IsNullOrEmpty(apiId))
4 {
5 HelpPageApiModel apiModel = Configuration.GetHelpPageApiModel(apiId);
6 if (apiModel != null)
7 {
8 //防止生成帮助文档时将area作为了Uri参数
9 foreach (var item in apiModel.UriParameters)
10 {
11 if (item.Name.Equals("area"))
12 {
13 apiModel.UriParameters.Remove(item);
14 break;
15 }
16 }
17
18 return View(apiModel);
19 }
20 }
21
22 return View(ErrorViewName);
23 }
至此修改完成,运行后在help页面,API地址显示正常,TestAPI测试通过
另外,看到有人使用RoutePrefix和Route等路由新特性处理的,没试过,有时间再研究一下
题外:运行WebAPI后直接显示Help页面
以上是关于WebAPI HelpPage支持area的主要内容,如果未能解决你的问题,请参考以下文章