首页 > 解决方案 > 需要 httpcontext 和 httpcontextbase 之间的公共对象

问题描述

我正在使用基于 asp.net mvc 5 和 asp.net web api 2 owin 的 web 应用程序。第一个是网站,第二个是后端 api。

我需要共享一些库,在 asp.net mvc 应用程序中,我可以访问作为 web.api 中的 HttpBaseRequest 的 HttpContextBase.Request 可以访问作为 HttpRequest 的 httpContext.Request

计划将来升级到 asp.net 核心,在我的类库中共享一个公共对象的最佳方式是什么?

标签: asp.net-mvc-5asp.net-web-api2

解决方案


您可以定义一个表示访问 httpcontext 的接口,但无需将其绑定到任何特定的 http 相关类型

然后,提供特定于您的库和应用程序正在处理的框架的实现。.net framework 和 .net mvc 和 dotnet-core 各自为 http contexf、request、response 定义了不同的实现。

例如

interface IMyHttpContext

class Net4HttpContext : IMyHttpContext

class NetCoreHttpContext : IMyHttpContext

然后,只暴露你需要的东西。例如GetRequestPath、WriteToResponse、GetHeader、SetCookie。等等..这将是很多持续的工作,但结果是,您的网络标准库(其中一个应该托管您的接口,顺便说一句)不会关心实施。显然,您必须将特定 http 对象的所有用法替换为您的界面。

因此,IMyHttpContext 转到一个新的网络标准程序集。这个程序集将适用于所有 dotnet 框架。

Net4HttpContext 转到 net45 程序集,它本身引用 System.Webb。您可以通过仅限 Windows 的 .net 框架应用程序来引用它。

NetCoreHttpContext 转到 dotnetcore 或 netstandard 程序集,引用 dotnet core 的 http 相关 nuget 包。将此与 dotnet 核心应用程序一起使用。

然后,在您的整个应用程序中,无论是 net45 还是 netcore,以及一些 DI 设置,您都只引用了您的界面。实现被注入。

祝你好运。


推荐阅读