我需要使用Server.MapPath。由于库项目没有 Startup.cs,我无法应用正常的方式。
首先,在使用Library项目的Startup.cs中注册HttpcontextAccessor服务,
services.AddHttpContextAccessor();
然后在课堂上,
private static HttpContext _httpContext => new HttpContextAccessor().HttpContext;
private static IWebHostEnvironment _env => (IWebHostEnvironment)_httpContext.RequestServices.GetService(typeof(IWebHostEnvironment));
现在您可以在静态类和静态方法中访问它。
这对我有用。如果有人需要的话
.NET 6.0中另一种可能的解决方案如下:
public static class MainHelper
{
public static IWebHostEnvironment _hostingEnvironment;
public static bool IsInitialized { get; private set; }
public static void Initialize(IWebHostEnvironment hostEnvironment)
{
if (IsInitialized)
throw new InvalidOperationException("Object already initialized");
_hostingEnvironment = hostEnvironment;
IsInitialized = true;
}
}
在Program.cs中注册HttpcontextAccessor并发送参数到Initialize
builder.Services.AddHttpContextAccessor();
MainHelper.Initialize(builder.Environment);
现在您可以在项目中的任何位置使用_hostingEnvironment,如下所示:
var path = MainHelper._hostingEnvironment.ContentRootPath;
或
var path = MainHelper._hostingEnvironment.WebRootPath;
由于我在 dotnet 8 中使用 Clean Architecture,因此我需要在单独的类库中使用一些 Asp.Net 功能,例如 IFormFile 和 IWebHostEnvironment。
过去,我们可以使用一些软件包来访问它们,但现在它们都已弃用。
原因:基于
Microsoft 文档:
解决方案:随着 .NET Core 3.0 的发布,许多 ASP.NET Core 程序集不再作为包发布到 NuGet。
解决方法太简单了,只需按照以下步骤操作即可:
1- 转到您的类库并打开 csproj 文件
2- 添加此:
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
您完成的 csproj 文件必须是这样的:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
</Project>