NullReferenceException 在启动时遇到 Owin .Net Core 2.0 - 设置?
NullReferenceException experienced with Owin on Startup .Net Core 2.0 - Settings?
我正在尝试启动一个 WebApp 以在 .NET Core 2.0 项目中与 NancyFx 一起使用。
我添加到解决方案中的包是
Microsoft.AspNet.WebApi.OwinSelfHost
安装它的依赖项:
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.Owin
Microsoft.Owin
Microsoft.Owin.Host.HttpListener
Microsoft.Owin.Hosting
Newtonsoft.Json
Owin
我还添加了:
Nancy
Nancy.Owin
我的项目类型为 "xUnit Test Project (.NET Core)"。
从我的测试 class 开始,我们有:
public class MyIntegrationTests : IDisposable
{
private readonly IDisposable _webApp;
private const string Url = "http://localhost:1234";
public MyIntegrationTests()
{
_webApp = WebApp.Start<Startup>(url: Url);
}
我的启动 class 看起来像:
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
appBuilder.UseNancy();
}
}
我还有一个带有测试路线的 NancyModule:
public class TestModule : NancyModule
{
public TestModule()
{
Get("/test", args => "test");
}
}
但是,在启动我的集成测试模块时(通过尝试 运行 其中的任何测试),我遇到了空引用异常。
这是堆栈跟踪:
System.NullReferenceException : Object reference not set to an instance of an object.
at Microsoft.Owin.Hosting.Utilities.SettingsLoader.FromConfigImplementation..ctor()
at Microsoft.Owin.Hosting.Utilities.SettingsLoader.b__0()
at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Func`1 valueFactory)
at Microsoft.Owin.Hosting.Utilities.SettingsLoader.LoadFromConfig(IDictionary`2 settings)
at Microsoft.Owin.Hosting.Engine.StartContext..ctor(StartOptions options)
at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options)
at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options)
at [redacted].IntegrationTests.MyIntegrationTests..ctor() in C:\Users[redacted]\source\repos[redacted].IntegrationTests\MyIntegrationTests.cs:line 21
我尝试过的:
- 逐一添加不同版本的软件包。
- 更改我的启动 Class 以添加 HttpConfiguration
- 清除本地主机 cookie(在此处的其他主题中建议)
- 使用本指南:https://github.com/NancyFx/Nancy/wiki/Hosting-nancy-with-owin#katana---httplistener-selfhost 我收到与之前完全相同的错误。
对我来说,似乎缺少配置 - 或者未找到配置。但是,我所指的一切都存在。有任何想法吗?
(值得一提 - 这个测试项目没有 appsettings.json、web.config 等)
编辑:此处提供测试项目:https://www.dropbox.com/s/v1bw5pu9t0e9fwt/NancyOwinTest.zip?dl=0
制作测试项目时,我意识到它正在恢复 .NET 4.6.1 级别的包,而不是 .NET Core。
我很可能犯了一个愚蠢的错误,但我还没有弄清楚是哪一个。
所以,由于兼容性问题,我这样做似乎是不可能的。
但是,我偶然发现了一种直接配置 csproj 文件以引用正确包的方法,此处:https://github.com/NancyFx/Nancy/issues/2863#issuecomment-365107613
在此处复制配置以防出现故障:
<Project Sdk="Microsoft.NET.Sdk.Web" ToolsVersion="15.0">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<DebugType>portable</DebugType>
<AssemblyName>nancydemo</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>nancydemo</PackageId>
<RuntimeFrameworkVersion>2.0.5</RuntimeFrameworkVersion>
<StartupObject>NancyApplication.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Owin" Version="2.0.1" />
<PackageReference Include="Nancy" Version="2.0.0-barneyrubble" />
</ItemGroup>
</Project>
结合启动class:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseOwin(x => x.UseNancy());
}
}
上面的主要测试 运行 片段替换为:
public class MyIntegrationTests : IDisposable
{
private readonly IWebHost _webApp;
private const string Url = "http://localhost:1234";
public MyIntegrationTests ()
{
_webApp = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.UseUrls(Url)
.Build();
_webApp.Start();
}
NancyModule 保持不变:
public class TestModule : NancyModule
{
public TestModule()
{
Get("/test", args => "test");
}
}
这现在可以满足我的需要了! (用于测试目的的基本 'server' 响应请求)
我正在尝试启动一个 WebApp 以在 .NET Core 2.0 项目中与 NancyFx 一起使用。
我添加到解决方案中的包是
Microsoft.AspNet.WebApi.OwinSelfHost
安装它的依赖项:
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.Owin
Microsoft.Owin
Microsoft.Owin.Host.HttpListener
Microsoft.Owin.Hosting
Newtonsoft.Json
Owin
我还添加了:
Nancy
Nancy.Owin
我的项目类型为 "xUnit Test Project (.NET Core)"。
从我的测试 class 开始,我们有:
public class MyIntegrationTests : IDisposable
{
private readonly IDisposable _webApp;
private const string Url = "http://localhost:1234";
public MyIntegrationTests()
{
_webApp = WebApp.Start<Startup>(url: Url);
}
我的启动 class 看起来像:
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
appBuilder.UseNancy();
}
}
我还有一个带有测试路线的 NancyModule:
public class TestModule : NancyModule
{
public TestModule()
{
Get("/test", args => "test");
}
}
但是,在启动我的集成测试模块时(通过尝试 运行 其中的任何测试),我遇到了空引用异常。 这是堆栈跟踪:
System.NullReferenceException : Object reference not set to an instance of an object.
at Microsoft.Owin.Hosting.Utilities.SettingsLoader.FromConfigImplementation..ctor()
at Microsoft.Owin.Hosting.Utilities.SettingsLoader.b__0() at System.Threading.LazyInitializer.EnsureInitializedCore[T](T& target, Func`1 valueFactory)
at Microsoft.Owin.Hosting.Utilities.SettingsLoader.LoadFromConfig(IDictionary`2 settings)
at Microsoft.Owin.Hosting.Engine.StartContext..ctor(StartOptions options)
at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options)
at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options)
at [redacted].IntegrationTests.MyIntegrationTests..ctor() in C:\Users[redacted]\source\repos[redacted].IntegrationTests\MyIntegrationTests.cs:line 21
我尝试过的:
- 逐一添加不同版本的软件包。
- 更改我的启动 Class 以添加 HttpConfiguration
- 清除本地主机 cookie(在此处的其他主题中建议)
- 使用本指南:https://github.com/NancyFx/Nancy/wiki/Hosting-nancy-with-owin#katana---httplistener-selfhost 我收到与之前完全相同的错误。
对我来说,似乎缺少配置 - 或者未找到配置。但是,我所指的一切都存在。有任何想法吗? (值得一提 - 这个测试项目没有 appsettings.json、web.config 等)
编辑:此处提供测试项目:https://www.dropbox.com/s/v1bw5pu9t0e9fwt/NancyOwinTest.zip?dl=0 制作测试项目时,我意识到它正在恢复 .NET 4.6.1 级别的包,而不是 .NET Core。 我很可能犯了一个愚蠢的错误,但我还没有弄清楚是哪一个。
所以,由于兼容性问题,我这样做似乎是不可能的。 但是,我偶然发现了一种直接配置 csproj 文件以引用正确包的方法,此处:https://github.com/NancyFx/Nancy/issues/2863#issuecomment-365107613
在此处复制配置以防出现故障:
<Project Sdk="Microsoft.NET.Sdk.Web" ToolsVersion="15.0">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<DebugType>portable</DebugType>
<AssemblyName>nancydemo</AssemblyName>
<OutputType>Exe</OutputType>
<PackageId>nancydemo</PackageId>
<RuntimeFrameworkVersion>2.0.5</RuntimeFrameworkVersion>
<StartupObject>NancyApplication.Program</StartupObject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Owin" Version="2.0.1" />
<PackageReference Include="Nancy" Version="2.0.0-barneyrubble" />
</ItemGroup>
</Project>
结合启动class:
public class Startup
{
public void Configure(IApplicationBuilder app)
{
app.UseOwin(x => x.UseNancy());
}
}
上面的主要测试 运行 片段替换为:
public class MyIntegrationTests : IDisposable
{
private readonly IWebHost _webApp;
private const string Url = "http://localhost:1234";
public MyIntegrationTests ()
{
_webApp = new WebHostBuilder()
.UseKestrel()
.UseStartup<Startup>()
.UseUrls(Url)
.Build();
_webApp.Start();
}
NancyModule 保持不变:
public class TestModule : NancyModule
{
public TestModule()
{
Get("/test", args => "test");
}
}
这现在可以满足我的需要了! (用于测试目的的基本 'server' 响应请求)