【问题标题】:Run ASP.NET MVC Web API next to Web App at the same time同时在 Web App 旁边运行 ASP.NET MVC Web API
【发布时间】: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


    【解决方案1】:

    是的,在 Visual Studio 中可以同时运行多个项目 转到解决方案并将启动项目设置为多个(从您的项目列表中选择)

    【讨论】:

    • 这不是我要找的答案。它与运行多个项目无关。在上述两种情况下,我会在调试时使用多个启动项目(IIS Express)或作为生产 IIS 上的两个独立网站运行网页和 Web API。
    【解决方案2】:

    在我看来,你提到的两个想法都是可行的。它们各有优缺点。

    第一个想法

    第一种思路的好处是API和MVC集成在一个网站中,不存在跨域问题。但是有一个缺点,如果网站是一个大项目,某个地方的问题可能会影响到整体。您需要分别对 API 和 MVC 进行故障排除。

    但我也有义务在 API 中提供授权流程。所以不知道在这种情况下如何做到这一点。

    我可以提供的一个很好的选择是使用AuthenticationAuthorization Filter。如果您在 MVC 项目中有用户模型,这将变得很容易。只需为不同的用户设置不同的角色,然后在 APIController 或 Action 上添加 Filter Attribute。这将过滤掉不符合要求的用户。

    public class TestController : ApiController
        {
            [Authorize(Roles = "SuperAdmin, Admin, User")]
            [HttpGet]
            [Route("api/test/resource1")]
            public IHttpActionResult GetResource1()
            {
                return ...;
            }
    }
    

    您可以参考this docsthis article。这两个对我都有帮助。

    第二个想法

    第二种想法的优点是它们易于排除故障和调试。正如你所说,它很干净。但缺点是如果它需要与MVC站点通信,则需要启用CORS。(设置在Web APIIIS

    我有两个网站(网页和 API)与 MS SQL 通信 服务器使用相同的连接字符串,不确定它是否可以工作?

    您无需担心。多个站点可以使用相同的连接字符串与 SQL 进行通信。 IIS 上有一个名为 Connection Strings 的模块。它用于设置连接字符串。

    【讨论】:

      猜你喜欢
      • 2015-06-02
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 2023-03-22
      • 2015-08-11
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      相关资源
      最近更新 更多