我有一个ASP.Net Core 2.0 Web应用程序我正在使用单元测试进行改造(使用NUnit).该应用程序工作正常,迄今为止大多数测试工作正常.
但是,测试身份验证/授权(用户是否已登录并可以访问已[Authorize]过滤的操作)失败...
System.ArgumentNullException: Value cannot be null.
Parameter name: provider
Run Code Online (Sandbox Code Playgroud)
...后...
await HttpContext.SignInAsync(principal);
Run Code Online (Sandbox Code Playgroud)
......但目前尚不清楚其根本原因是什么.代码执行在此处停止,并且IDE中没有显示异常,但代码执行返回给调用者,然后终止(但我仍然The program '[13704] dotnet.exe' has exited with code 0 (0x0).在VS的输出窗口中看到)
测试资源管理器显示红色并提供引用的异常(否则我不知道问题.)
我正在努力创建一个指向人们的复制品(到目前为止有点参与其中).
有谁知道如何确定根本原因?这是DI相关的问题(测试中没有提供但是正常执行中需要的东西)?
UPDATE1:提供请求的验证码......
public async Task<IActionResult> Registration(RegistrationViewModel vm) {
if (ModelState.IsValid) {
// Create registration for user
var regData = createRegistrationData(vm);
_repository.AddUserRegistrationWithGroup(regData);
var claims = new List<Claim> {
new Claim(ClaimTypes.NameIdentifier, regData.UserId.ToString())
};
var ident = new ClaimsIdentity(claims);
var principal = new ClaimsPrincipal(ident);
await HttpContext.SignInAsync(principal); // FAILS HERE
return …Run Code Online (Sandbox Code Playgroud) 我正在尝试向我的asp 5 mvc 6 web应用程序("rc1-final"库)提供一些额外的配置数据,以便部署在Azure上.此附加数据的一部分由json文件中的数据数组组成.我可以将这个json文件添加到我的配置中,并且在调试时如果我观察配置对象,我可以浏览到提供程序条目,看到它确实联系了我正在寻找的数据数组.
但是,尝试Configuration["extraData"]产生null(因为该属性的"值"为null,即使它显然包含元素数组.
我没有问题访问存储在json配置中的单个值(例如我的数据库连接字符串和其他值.)看起来好像不支持数组格式的json数据?
请参阅以下示例json文件(根据jsonlint进行验证,对我来说似乎很好)...
//extraData.json
{
"ExtraData": [
{
"Id": 1,
"Description": "The first identifier"
},
{
"Id": 2,
"Description": "The second identifier"
},
{
"Id": 3,
"Description": "The third identifier"
}
]
}
Run Code Online (Sandbox Code Playgroud)
...以及以下示例Startup.cs ...
//Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Data.Entity;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using Newtonsoft.Json.Linq;
using System.IO;
using Microsoft.AspNet.Authentication.Cookies;
using System.Net;
namespace MyProj { …Run Code Online (Sandbox Code Playgroud) 考虑代码...
using System;
using System.Text.Json;
public class Program
{
public static void Main()
{
int id = 9;
string str = "{\"id\": " + id + "}";
var u = JsonSerializer.Deserialize<User>(str);
Console.WriteLine($"User ID: {u.Id}, Correct: {id == u.Id}"); // always 0/init/default value
}
}
public class User {
public int Id { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
为什么数据没有正确反序列化到User对象中?我还通过DotNetFiddle验证了该行为,以防它是我系统的本地问题。不会抛出任何异常。
我的实际执行是从读[ApiController]的[HttpPost]后我的行动return Created("user", newUser)。它在我的 MVC/Razor 项目中通过_httpClient.PostAsync. 我在Created返回到PostAsync调用时验证了这些值是正确的,但无论如何,从响应正文解析的值仅包含默认值(实际 ID …
在Win10中。VS Code、帮助、关于...
[窗口标题]
Visual Studio Code
[内容]
版本 1.14.2
提交 cb82febafda0c8c199b9201ad274e25d9a76874e
日期 2017-07-19T23:34:09.706Z
Shell 1.6.6
渲染器 56.0.2924.87
节点 7.4.0
生成launch.json并根据我的runtime...设置进行调整
{
// Use IntelliSense to learn about possible Node.js debug attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "npm.cmd",
"runtimeArgs": [
"run", "functional-test"
],
"skipFiles": [
"<node_internals>/**/*.js"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
上面引用的 Npm …
EF7不支持延迟加载子对象,但支持该.Include()功能.话虽这么说,我正在努力解决一些问题,我不确定它是否在EF7中是不可能的,或者我只是盯着这个太久了.
假设如下所示(check reg.Activities.Task.Ordinal(an int),Task始终为null,即使我自己检查数据库并且确定实际上存在相关记录)...
public void SomeOtherMethod()
var r = getRegistration(User.UserName);
var act = r.Activities
.Where(a => a.IsDone == false) // unfinished
.OrderByDescending(o => o.Task.Ordinal) // Task indicates activity type, is always null
.FirstOrDefault(); // to get a user's most recent unfinished activity
//DO SOMETHING WITH ACT
}
public Registration getRegistration(string userName) {
var reg = _context.Registrations
.Where(r => r.User.UserName == userName) // this works however?
.Include(r => r.Acvitities) // List<Activity>
.FirstOrDefault();
return reg;
} …Run Code Online (Sandbox Code Playgroud) 我花了几天的时间,终于找到了一个似乎有效的解决方案。然而,它似乎有点脆弱,或者可能是不明智的。
我希望所有非系统引用的程序集(当前使用的项目库是 NuGet 管理的)都包含在构建输出的“libs”子文件夹中。
我的 csproj 文件底部包含的以下代码段执行此操作(通过谷歌搜索和我在这里找到的几个问题构建。)
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. -->
<Target Name="BeforeBuild">
<Message Text="### Removing existing 'lib' folder" Importance="high" />
<RemoveDir Directories="$(TargetDir)libs" />
</Target>
<Target Name="MoveLibrariesOnBuild" AfterTargets="Build">
<ItemGroup>
<Libraries Include="%(Reference.HintPath)" >
<MissingHintPath>$([MSBuild]::ValueOrDefault('%(Reference.HintPath)', '').Equals(''))</MissingHintPath>
</Libraries>
</ItemGroup>
<Message Text="### Moving libraries to 'libs' ###" Importance="high" />
<Copy SourceFiles="@(Libraries)"
DestinationFiles="$(TargetDir)libs\%(Filename).dll"
Condition="%(Libraries.MissingHintPath) == False"
SkipUnchangedFiles="false"
OverwriteReadOnlyFiles="true" />
</Target> …Run Code Online (Sandbox Code Playgroud) c# ×5
asp.net-core ×2
asp.net ×1
asp.net-mvc ×1
debugging ×1
json ×1
msbuild ×1
node.js ×1
nunit-3.0 ×1
windows ×1