• 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             );
    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页面

    1 routes.MapRoute(
    2                 name: "Default",
    3                 url: "{controller}/{action}/{id}",
    4                 defaults: new { controller = "Help", action = "Index", id = UrlParameter.Optional },
    5                 namespaces: new string[] { "HelpController命名空间" }
    6             ).DataTokens.Add("Area","HelpPage");
    路由配置
  • 相关阅读:
    核心动画-关键帧动画易混淆属性记录
    CALayer的隐式动画
    const位置上的不同代表哪些不同的意义
    又是一年国庆假期最后一天
    你做微商赚到钱了吗?
    为什么你不看好家教O2O
    【算法】基数排序
    【算法】快速排序/数组第K小的元素
    【算法】归并排序
    【算法】插入排序/冒泡排序/选择排序
  • 原文地址:https://www.cnblogs.com/xihao/p/6892192.html
Copyright © 2020-2023  润新知