原文: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);
}