接口 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);
}
原文地址:https://www.cnblogs.com/guxingy/p/12843876.html