在 ASP.NET 4.x 应用程序中使用 ASP.NET 核心中间件

Using ASP.NET Core middleware in ASP.NET 4.x app

我有一个针对 .NET Standard 2.0 和 ASP.NET 核心中间件的库项目。它适用于以 asp.net 核心为 .NET 6 的应用程序。我希望能够在 asp.net 4.x 应用程序中使用相同的 middleware/library。

是否有适配器 class 或者我可以在库中创建一个允许 4.x 应用程序使用 asp.net 核心的中间件的适配器?所以基本上适配器将利用 4.x 应用程序的管道并拦截匹配路径的 http 请求。然后将这些调用传递给库中的 asp.net 核心中间件或业务逻辑层。

或者,我可以有两个不同的中间件吗?一个用于 asp.net 核心应用程序(当前),另一个用于同一库中的 asp.net 4.x 应用程序?两个中间件将共享相同的后端库。

为了使用 ASP.NET MVC 4 应用程序(我假设这就是您的意思)并查看 Request 您需要与来自 HttpContext 的System.Web 库,在 .Net Standard 中不可用。这有点过于简单化,但您可以 read more here.

要解决这个问题,一种选择是将您的图书馆放在 3 个项目中。业务逻辑项目将以 .Net Standard 2.0 为目标。使用 .Net Core 中间件的项目将以 .Net Core x.x(或 .Net Standard 2.1)为目标并引用业务逻辑项目。第三个项目将以 .NetFX 4.6+ 为目标并引用您的业务逻辑项目。这当然会产生 2 个单独的 DLLs/NuGet 包并且不太理想,但可能是最简单的解决方案。

至于原问题,ASP.NET MVC 4 没有内置中间件的概念。您可以添加 Microsoft.Owin.Host.SystemWeb 包以将其引入 MVC4 应用程序。

Information from Microsoft on OWIN/Middleware

但是,您无法为 MVC 4 和 .Net Core 重用相同的中间件 class,因为它们的依赖项和签名不同。它还需要对您现有的 MVC 应用程序进行一些更改。

另一种选择是创建一个 IHttpModule 挂接到最适合您的目的的 HttpApplication life cycle stage 并在那里执行您的业务逻辑。

public class FakeMiddlewareHttpModule : IHttpModule 
{
    public void Dispose()
    {
        throw new NotImplementedException();
    }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += Context_BeginRequest;
    }

    private void Context_BeginRequest(object sender, EventArgs e) 
    {
        HttpApplication app = (HttpApplication)sender;
        HttpContext context = app.Context;        
        var businessLogic = new BusinessLogicClass();
        businessLogic.PerformATaskOnTheRequest(context.Request);
    }
}

您必须在 web.config:

中注册该模块
<!-- Registering in Classic mode -->
<configuration>
  <system.web>
    <httpModules>
      <add name="FakeMiddlewareHttpModule" type="FakeMiddlewareHttpModule"/>
     </httpModules>
  </system.web>
</configuration>

<!-- Registering in IIS7 Integrated mode -->
<configuration>
  <system.webServer>
    <modules>
      <add name="FakeMiddlewareHttpModule" type="FakeMiddlewareHttpModule"/>
    </modules>
  </system.webServer>
</configuration>