WebAPI HelpPage支持area
阿新 • • 發佈:2017-05-23
tap 處理 mod empty ont cbe ipa option ppa
開篇:對於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 );
Routes
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 }
ApiDescriptionExtensions
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 }
Api
至此修改完成,運行後在help頁面,API地址顯示正常,TestAPI測試通過
另外,看到有人使用RoutePrefix和Route等路由新特性處理的,沒試過,有時間再研究一下
題外:運行WebAPI後直接顯示Help頁面
WebAPI HelpPage支持area