在 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>
我有一个针对 .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>