zoukankan      html  css  js  c++  java
  • 接口 Swagger 01 让Asp.net MVC项目显示API文档

    原文:https://www.cnblogs.com/landeanfen/p/5501487.html
    原文:https://www.cnblogs.com/WeiGe/p/3843680.html
    原文:https://blog.csdn.net/qq_17255515/article/details/89338986


    一、背景

    原项目是用asp.net mvc + ef开发的,主要逻辑都写在controller里面,现在需要对接app。


    二、大致规划

    让改动尽可能的小,在原始项目中添加web api的支持,然后再引用swagger生成api文档即可


    三、具体步骤


    1、创建一个asp.net mvc测试项目


    2、在Controller文件夹中,添加一个Web Api Controller

    操作路径:在文件夹上右键 -> 添加 -> 新建项 -> Web API -> Web API 控制器类,创建一个Web API 控制器类HomeApiController.cs

    3、在App_Start文件夹中创建类WebApiConfig,该类用于配置Web API

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务
            // Web API 路由
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
    

    4、在Global.asax中注册WebApiConfig

    代码如下:

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);//自己添加的
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    

    5、NuGet添加Swashbuckle的引用


    6、启动项目,游览器访问地址https://localhost:44327/swagger



    四、细节优化


    1、Web API的路由,把Action(方法名)加进去

    WebApiConfig.cs文件,把"api/{controller}/{id}", 修改为 "api/{controller}/{action}/{id}"

    2、去掉Web API的路由中的API

    原效果:GET /api/HomeApi/Get/{id}
    修改后:GET /api/Home/Get/{id}

    WebApiConfig.cs文件,在Register方法开头,添加如下代码:

    var suffix = typeof(DefaultHttpControllerSelector).GetField("ControllerSuffix", BindingFlags.Static | BindingFlags.Public);
    if (suffix != null) suffix.SetValue(null, "ApiController");
    

    3、Web API Controller 调用 Asp.net MVC Controller 里面的方法

    mvc controller:

    [HttpGet]
    public JsonResult GetById(int id)
    {
    return Json(new { id = id }, JsonRequestBehavior.AllowGet);
    }
    

    web api controller:

    [HttpGet]
    public IHttpActionResult GetById(int id)
    {
        HomeController _HomeController = new HomeController();
        var d = _HomeController.GetById(id).Data;
        return Json<dynamic>(d);
    }
    

    4、Web API Controller 调用 Asp.net MVC Controller 里面的方法(方法里面含有session)

    mvc controller:

    [HttpGet]
    public JsonResult GetSession()
    {
        int id = (int)Session["id"];
        return Json(new { id = id }, JsonRequestBehavior.AllowGet);
    }
    

    web api controller:

    [HttpGet]
    public IHttpActionResult GetSession()
    {
        //模拟session
        System.IO.TextWriter writer = new System.IO.StringWriter();
        HttpRequest request = new HttpRequest("", "http://localhost:58059/Home/Index", "");
        HttpResponse response = new HttpResponse(writer);
        HttpContext context = new HttpContext(request, response);
        var container = new System.Web.SessionState.HttpSessionStateContainer(
            "",
            new SessionStateItemCollection(),
            new HttpStaticObjectsCollection(),
            20000,
            true,
            HttpCookieMode.UseCookies,
            SessionStateMode.Off,
            false
            );
        SessionStateUtility.AddHttpSessionStateToContext(context, container);
        context.Session.Add("id", 123);
        HttpContextBase httpContext = new HttpContextWrapper(context);
    
        HomeController controller = new HomeController();
        System.Web.Mvc.ControllerContext controllerContext = new System.Web.Mvc.ControllerContext();
        controllerContext.HttpContext = httpContext;
        controller.ControllerContext = controllerContext;
        var d = controller.GetSession().Data;
        return Json<dynamic>(d);
    }
    
  • 相关阅读:
    说说 Java 线程间通信
    Java 内存模型与内存结构
    Spring Boot 整合 Shiro
    HashMap 实现原理
    Spring Boot 自动配置原理
    Spring Cloud 全链路追踪实现
    JVM 类加载机制
    volatile 关键字的作用
    Spring Boot 整合 Redis
    Docker命令
  • 原文地址:https://www.cnblogs.com/guxingy/p/12843876.html
Copyright © 2011-2022 走看看