ASP.NET 核心 3.0 get_HostingEnvironment() 在扩展中找不到方法
ASP.NET Core 3.0 get_HostingEnvironment() Method not found in extension
下面的代码复制了我试图在新的 ASP.NET Core 3.0 API 项目中创建的某些扩展的错误。
using ClassLibrary1;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureAppConfiguration((context, config) =>
{
// this works fine
var env = context.HostingEnvironment;
});
webBuilder.CustomConfigureAppConfiguration();
})
.ConfigureAppConfiguration((context, config) =>
{
// this works fine
var env = context.HostingEnvironment;
})
.CustomConfigureAppConfiguration();
}
}
此 Extensions
class 需要在不同的项目中。在同一个主项目中似乎工作正常。
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
// This project can be either netstandard2.0 or netcoreapp3.0
namespace ClassLibrary1
{
public static class Extensions
{
public static IWebHostBuilder CustomConfigureAppConfiguration(this IWebHostBuilder hostBuilder)
{
hostBuilder.ConfigureAppConfiguration((context, config) =>
{
// this fails with System.MissingMethodException: 'Method not found: 'Microsoft.AspNetCore.Hosting.IHostingEnvironment Microsoft.AspNetCore.Hosting.WebHostBuilderContext.get_HostingEnvironment()'.'
var env = context.HostingEnvironment;
});
return hostBuilder;
}
public static IHostBuilder CustomConfigureAppConfiguration(this IHostBuilder hostBuilder)
{
hostBuilder.ConfigureAppConfiguration((context, config) =>
{
// this fails with System.MissingMethodException: 'Method not found: 'Microsoft.Extensions.Hosting.IHostingEnvironment Microsoft.Extensions.Hosting.HostBuilderContext.get_HostingEnvironment()'.'
var env = context.HostingEnvironment;
});
return hostBuilder;
}
}
}
它仅在运行时失败,并且仅在访问 HostingEnvironment
时失败。当 removing/commenting 分配 var env = context.HostingEnvironment;
时,我仍然可以在调试中检查并查看它。
知道我在这里遗漏了什么吗?
编辑
将 ClassLibrary1
项目更新为 netcoreapp3.0
并添加 <FrameworkReference Include="Microsoft.AspNetCore.App" />
如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
</ItemGroup>
</Project>
如果可能,我仍然希望将项目保留为 netstandard2.0
。也许我需要一些特定的 NuGet 包?
请将您的 HostingEnvironment
替换为 WebHostEnvironment
。
正如文档所说:
Replace IHostingEnvironment with IWebHostEnvironment and add a using statement for the Microsoft.Extensions.Hosting namespace.
对于 netstandard2.0
项目,我只能在 HostBuilderContext
中获取 HostingEnvironment
(来自 IHostBuilder.ConfigureAppConfiguration
)- 安装了 Microsoft.Extensions.Hosting.Abstractions
包:
public static IHostBuilder CustomConfigureAppConfiguration(this IHostBuilder hostBuilder)
{
hostBuilder.ConfigureAppConfiguration((context, config) =>
{
// this works with Microsoft.Extensions.Hosting.Abstractions installed
var env = context.HostingEnvironment;
});
return hostBuilder;
}
HostingEnvironment
from WebHostBuilderContext
(from IWebHostBuilder.ConfigureAppConfiguration)在被 netcoreapp3.0
项目执行时仍然抛出异常。这适用于以前的版本。
此外,当注释掉时,我仍然可以在调试期间检查它:
似乎还有点不对劲,但至少现在可以了。
更新
经过更多挖掘,我发现了参考文献的不同之处:
- netcoreapp3.0
- 通过 共享框架 Microsoft.AspNetCore.Hosting.Abstractions, Version=3.0.0.0
- netstandard2.0
通过 NuGet Microsoft.AspNetCore.Hosting.Abstractions, Version=2.2.0.0
v2.2 公开了 Microsoft.AspNetCore.Hosting.IHostingEnvironment
,它在 v3.0
中是 deprecated
自 2019 年 10 月 1 日起,v3.0 在 NuGet 上不可用。
我遇到了类似的问题。在我的例子 (EF 3.0) 中,我使用了一个带有 Microsoft.Extensions.Hosting (3.0.1)
的项目。这是使用来自不同项目的 class。第二个项目包括 Microsoft.Azure.WebJobs.Extensions (3.0.5)
。这个包有 Microsoft.Azure.WebJobs (3.0.14)
作为依赖项。这包括 Microsoft.Extensions.Hosting (2.1.0)
,它与 EF 3.0 不兼容。包括
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.1" />
在第二个项目中解决了我的问题。
我也遇到过这个;正如您所指出的,似乎最重要的是它不会起作用,因为 ASP.NET 3.x 仅在 netcoreapp3.x
项目上受支持。
像你一样,一旦我将我的 netstandard2.0
库转换为 netcoreapp3.0
(或者实际上是 .1)并引入 Microsoft.AspNetCore.App
框架参考(而不是引入整个Microsoft.Net.Sdk.Web
) 它自行解决了。
这不是最好的答案,但它是 "known"/设计决定,只是将 netstandard2.0/netframework 留在后面。
我有这个问题,我的无服务器API有另一个项目作为参考。在那个引用的项目中,我使用了以下 PackageReference:
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.Logging.Abstractions
只有将版本更改为 2.1.0 后,我才能使它正常工作
我使用的是 v3+
版本
请检查这个thread。
下面的代码复制了我试图在新的 ASP.NET Core 3.0 API 项目中创建的某些扩展的错误。
using ClassLibrary1;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.ConfigureAppConfiguration((context, config) =>
{
// this works fine
var env = context.HostingEnvironment;
});
webBuilder.CustomConfigureAppConfiguration();
})
.ConfigureAppConfiguration((context, config) =>
{
// this works fine
var env = context.HostingEnvironment;
})
.CustomConfigureAppConfiguration();
}
}
此 Extensions
class 需要在不同的项目中。在同一个主项目中似乎工作正常。
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
// This project can be either netstandard2.0 or netcoreapp3.0
namespace ClassLibrary1
{
public static class Extensions
{
public static IWebHostBuilder CustomConfigureAppConfiguration(this IWebHostBuilder hostBuilder)
{
hostBuilder.ConfigureAppConfiguration((context, config) =>
{
// this fails with System.MissingMethodException: 'Method not found: 'Microsoft.AspNetCore.Hosting.IHostingEnvironment Microsoft.AspNetCore.Hosting.WebHostBuilderContext.get_HostingEnvironment()'.'
var env = context.HostingEnvironment;
});
return hostBuilder;
}
public static IHostBuilder CustomConfigureAppConfiguration(this IHostBuilder hostBuilder)
{
hostBuilder.ConfigureAppConfiguration((context, config) =>
{
// this fails with System.MissingMethodException: 'Method not found: 'Microsoft.Extensions.Hosting.IHostingEnvironment Microsoft.Extensions.Hosting.HostBuilderContext.get_HostingEnvironment()'.'
var env = context.HostingEnvironment;
});
return hostBuilder;
}
}
}
它仅在运行时失败,并且仅在访问 HostingEnvironment
时失败。当 removing/commenting 分配 var env = context.HostingEnvironment;
时,我仍然可以在调试中检查并查看它。
知道我在这里遗漏了什么吗?
编辑
将 ClassLibrary1
项目更新为 netcoreapp3.0
并添加 <FrameworkReference Include="Microsoft.AspNetCore.App" />
如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="2.2.0" />
</ItemGroup>
</Project>
如果可能,我仍然希望将项目保留为 netstandard2.0
。也许我需要一些特定的 NuGet 包?
请将您的 HostingEnvironment
替换为 WebHostEnvironment
。
正如文档所说:
Replace IHostingEnvironment with IWebHostEnvironment and add a using statement for the Microsoft.Extensions.Hosting namespace.
对于 netstandard2.0
项目,我只能在 HostBuilderContext
中获取 HostingEnvironment
(来自 IHostBuilder.ConfigureAppConfiguration
)- 安装了 Microsoft.Extensions.Hosting.Abstractions
包:
public static IHostBuilder CustomConfigureAppConfiguration(this IHostBuilder hostBuilder)
{
hostBuilder.ConfigureAppConfiguration((context, config) =>
{
// this works with Microsoft.Extensions.Hosting.Abstractions installed
var env = context.HostingEnvironment;
});
return hostBuilder;
}
HostingEnvironment
from WebHostBuilderContext
(from IWebHostBuilder.ConfigureAppConfiguration)在被 netcoreapp3.0
项目执行时仍然抛出异常。这适用于以前的版本。
此外,当注释掉时,我仍然可以在调试期间检查它:
似乎还有点不对劲,但至少现在可以了。
更新
经过更多挖掘,我发现了参考文献的不同之处:
- netcoreapp3.0
- 通过 共享框架 Microsoft.AspNetCore.Hosting.Abstractions, Version=3.0.0.0
- netstandard2.0
通过 NuGet Microsoft.AspNetCore.Hosting.Abstractions, Version=2.2.0.0
v2.2 公开了 Microsoft.AspNetCore.Hosting.IHostingEnvironment
,它在 v3.0
自 2019 年 10 月 1 日起,v3.0 在 NuGet 上不可用。
我遇到了类似的问题。在我的例子 (EF 3.0) 中,我使用了一个带有 Microsoft.Extensions.Hosting (3.0.1)
的项目。这是使用来自不同项目的 class。第二个项目包括 Microsoft.Azure.WebJobs.Extensions (3.0.5)
。这个包有 Microsoft.Azure.WebJobs (3.0.14)
作为依赖项。这包括 Microsoft.Extensions.Hosting (2.1.0)
,它与 EF 3.0 不兼容。包括
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.1" />
在第二个项目中解决了我的问题。
我也遇到过这个;正如您所指出的,似乎最重要的是它不会起作用,因为 ASP.NET 3.x 仅在 netcoreapp3.x
项目上受支持。
像你一样,一旦我将我的 netstandard2.0
库转换为 netcoreapp3.0
(或者实际上是 .1)并引入 Microsoft.AspNetCore.App
框架参考(而不是引入整个Microsoft.Net.Sdk.Web
) 它自行解决了。
这不是最好的答案,但它是 "known"/设计决定,只是将 netstandard2.0/netframework 留在后面。
我有这个问题,我的无服务器API有另一个项目作为参考。在那个引用的项目中,我使用了以下 PackageReference:
- Microsoft.Extensions.Configuration.Abstractions
- Microsoft.Extensions.Logging.Abstractions
只有将版本更改为 2.1.0 后,我才能使它正常工作 我使用的是 v3+
版本请检查这个thread。