C# 为什么我的代码认为值是Microsoft.IdentityModel.Json.Linq.JObject,而实际上它应该是Newtonsoft.Json.Linq.JObject?

C# 为什么我的代码认为值是Microsoft.IdentityModel.Json.Linq.JObject,而实际上它应该是Newtonsoft.Json.Linq.JObject?,c#,identityserver4,C#,Identityserver4,由于单元测试失败,我遇到了很多困难。具体来说, JwtRequestAuthorizeTests.authorized\u应该接受\u request\u object()中的\u复杂\u对象。 测试试图向声明数组添加一个对象参数,但失败了,因为在请求通过管道后,缺少一个名为“someObj”的预期参数 作为记录,someObj只是一个json对象,定义如下: {{ "foo": { "bar": "bar" }, "baz": "baz" }} 另外,

由于单元测试失败,我遇到了很多困难。具体来说,

JwtRequestAuthorizeTests.authorized\u应该接受\u request\u object()中的\u复杂\u对象。

测试试图向声明数组添加一个对象参数,但失败了,因为在请求通过管道后,缺少一个名为“someObj”的预期参数

作为记录,
someObj
只是一个json对象,定义如下:

{{
    "foo": {
        "bar": "bar"
    },
    "baz": "baz"
}}
另外,当我从GitHub中提取最新的IdentityServer代码时,测试通过了

我发现它失败的原因是因为在方法
JwtRequestValidator.ProcessPayloadAsync(JwtSecurityToken令牌)
中,变量
值的类型与预期的不同。具体来说,代码认为它是
Microsoft.IdentityModel.Json.Linq.JObject
,而它应该是
Newtonsoft.Json.Linq.JObject
。我一辈子都搞不懂为什么会这样

我加入这张图片是为了告诉你我没有疯(或者至少,为什么我不认为我疯了)。您可以看到从
value
JObject
的转换失败,因为
jobj=null
,您还可以看到
value.GetType()
返回
Microsoft.IdentityModel.Json.Linq.JObject

那么StackOverflow可以告诉我为什么会发生这种情况,也许我可以如何解决它吗?

另外,我认为值得注意的是,我引用了Newtonsoft.Json,因为它应该是:


微软决定移植一份JSON.NET副本,以便维持信任链。您可以找到它的定义位置:

从.Netframework WebAPI迁移到dotnetcore3.1后,我遇到了完全相同的问题。我简直不敢相信我在互联网上搜索了所有的东西,只找到了这个问题作为唯一相关的结果

显然,JWT负载类型不再是
NewtonSoft.Json.Linq.JObject
。它现在是Microsoft.IdentityModel.Json.Linq.JObject
,在其名称空间之外无法访问

我猜微软已经改变了定义,不希望人们在名称空间之外使用该类型

我最后做的是摆脱类型检查,直接在
try{}catch{}
块中解析。


希望这能在将来帮助其他人。

我今天也遇到了这个问题,你能解决吗?不,对不起,伙计。太久以前了,我不记得了。