【发布时间】:2022-01-13 11:34:27
【问题描述】:
我有一个 ASP.NET MVC Framework (.NET Framework 4.7.2) Web 应用程序。现在它在 IIS 服务器上运行并使用 MS SQL 数据库。业务逻辑和网站本身的很大一部分是几年前由另一家公司编写的。我持有程序集的源代码。
我遇到的问题是我必须将 Web API 添加到项目中。 API 将只包含几个控制器方法,没什么特别的。我不知道哪种方法在这种情况下是最好的。我已经阅读了大量关于 SO 等的帖子,但仍然不相信。
我的第一个想法是在设置网页路由之前添加“Microsoft ASP.NET Web API”包并在Global.asax.cs 文件中设置API 的路由。之后,我可以添加控制器(使用属性 [Route("api/[controller]")] 并在 IoC 容器中添加更改。所以,我在解决方案中会有两种类型的控制器,一种在 Controller 类之后继承,另一种在之后继承ApiController 类。但我也有义务在 API 中提供授权过程。所以不知道在这种情况下如何做到这一点。
另一个想法是在解决方案中创建一个单独的项目,仅用于 API 项目。我会使用网页项目中使用的程序集(比如说,业务逻辑)。我会创建另一个 IIS 网站,我会在其中放置 API。我有两个网站(网页和 API)使用相同的连接字符串与 MS SQL Server 通信,不确定它是否可以工作?这两个网站都将拥有其程序集文件的副本。在这种情况下,添加授权似乎要简单得多(?)。
我认为第二个是更清洁的,但考虑到我只需要 API 的 15 个控制器方法这一事实,这可能太费劲了。但是如果一切都在一个地方,如何提供授权呢?
编辑
我决定使用前面提到的第一种方法。因为我只有几个控制器,实际上是十几个,这似乎是最直接的想法。我已经设置了 API 路由 - 在 MVC 路由之前 - 通过设置属性路由和基于约定的路由。
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
后来,在不同的程序集中,我在 Autofac IoC 容器中注册了常规 MVC 控制器旁边的 API 控制器。
builder.RegisterControllers(assembly).PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
builder.RegisterApiControllers(assembly).PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
最后,我设置了依赖解析器。
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
我还没有使用过身份验证和授权机制,但我打算尽快使用。我将按照 Bruce Zhang 的建议使用 JWT 对请求进行身份验证和授权。我认为这种方法应该在我在 MVC 中使用的 cookie 身份验证旁边起作用。
【问题讨论】:
标签: c# asp.net .net asp.net-mvc iis