'Jwt' 不存在于命名空间 System.IdentityModel.Tokens 中 - 仅在生产中
'Jwt' does not exist in the namespace System.IdentityModel.Tokens - in production only
我正在尝试在我的基于 Orchard CMS 的网站中启动一个 web-api 模块。 web-api 出于安全目的必须使用 JWT。
我制作了这样一个模块。在我的开发环境下离线构建编译,一切顺利。我能够查询 API 并得到一些结果。这里证明 API returns 我的开发环境中的 JWT Postman Response Screenshot
这很好,很漂亮。但是,当我尝试将模块上传到我现有的网站(基于 Orchard CMS)时,出现错误:
<directory>/JwtManager.cs(4): error CS0234: The type or namespace name 'Jwt' does not exist in the namespace 'System.IdentityModel.Tokens' (are you missing an assembly reference?)
参考程序集肯定包含在我正在创建的 nuget 包中(在 bin
目录中可见)。我在 Whosebug 上看到了关于 JWT 5.0.0.0+ 的程序集版本的其他问题,例如 - 但是 none 的问题出现了同样的错误。此外,我已经确认我的代码在构建中使用了正确的对象,例如。 SigningCredentials 和 SymmetricSecurityKey,所以我认为这些答案与我的具体情况无关。
我不太熟悉用参考程序集解决此类问题,所以如果这是一个简单的修复,我深表歉意。这是我尝试做的事情:
- 在构建 nuget 包之前,在我的项目中将
System.IdentityModel.Tokens.Jwt
"Specific Version" 属性 设置为 true
。同样的错误仍然存在。
- 修改 Web.Config 以在旧版本的
System.IdentityModel.Tokens.Jwt
程序集上使用 bindingRedirect
。同样的错误仍然存在(该二进制文件的旧版本正在解决方案中的另一个项目中使用)。
- 删除
using System.IdentityModel.Tokens.Jwt;
语句,并强烈定义任何依赖此using 语句的对象。有趣的是,在这样做的过程中,我没有在 eg 的声明中收到错误。 System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler();
- 然而,我确实在 HttpActionResult 实现的 public string ReasonPhrase { get; }
行收到错误 must declare a body because it is not marked abstract or extern.
。
上面的第 3 点让我相信 ASP.Net 版本可能存在一些问题导致所有这些怪异(因为上面只是一个简单的 属性...),但我真的不是当然。我已确保目标框架在我的开发环境和在线环境 (.NET Framework 4.5.2) 上是相同的。
对我来说,none 是有道理的,因为在我的开发环境中一切都工作得很好,它建立在与我的在线环境相同版本的 OrchardCMS 上。
我在项目中使用的参考程序集:
System.IdentityModel.Tokens.Jwt
- v5.1.5.0
Microsoft.IdentityModel.Tokens
- v5.1.5.0
非常感谢在此问题上的任何帮助 - 这个小问题在很大程度上阻碍了我的进步,我似乎无法解决问题![=26=]
附加信息:
我应该澄清一下,我们在这个问题中提到的 "production" 环境不维护我们的源代码版本。然而,我已经创建了一个单独的测试环境来反映我们的生产环境,并在那里安装了源代码。
请务必注意,通过 Orchard CMS 管理仪表板安装 NuGet 包是加载我们代码的机制。本题之前提到的所有线上环境都是指这个尝试加载这段代码的过程。
当我实际将包作为项目添加到我们的解决方案时,问题没有发生,我们的 web-api 实现在我们的测试环境中工作。
但是,这不是解决方案,因为我们没有也不会在生产环境中维护解决方案源的版本。但是,它可能会为知识渊博的人提供一些关于正在发生的事情的线索?
根据 Orchard's Module Loader documentation - 动态编译在我们的在线环境中仍然启用。我们的参考库有一个问题导致无法编译服务器端。我相信 VS 以某种方式掩盖了这个问题并允许编译仍然离线进行,因为我们的解决方案确实包含正确的参考。
我正在尝试在我的基于 Orchard CMS 的网站中启动一个 web-api 模块。 web-api 出于安全目的必须使用 JWT。
我制作了这样一个模块。在我的开发环境下离线构建编译,一切顺利。我能够查询 API 并得到一些结果。这里证明 API returns 我的开发环境中的 JWT Postman Response Screenshot
这很好,很漂亮。但是,当我尝试将模块上传到我现有的网站(基于 Orchard CMS)时,出现错误:
<directory>/JwtManager.cs(4): error CS0234: The type or namespace name 'Jwt' does not exist in the namespace 'System.IdentityModel.Tokens' (are you missing an assembly reference?)
参考程序集肯定包含在我正在创建的 nuget 包中(在 bin
目录中可见)。我在 Whosebug 上看到了关于 JWT 5.0.0.0+ 的程序集版本的其他问题,例如
我不太熟悉用参考程序集解决此类问题,所以如果这是一个简单的修复,我深表歉意。这是我尝试做的事情:
- 在构建 nuget 包之前,在我的项目中将
System.IdentityModel.Tokens.Jwt
"Specific Version" 属性 设置为true
。同样的错误仍然存在。 - 修改 Web.Config 以在旧版本的
System.IdentityModel.Tokens.Jwt
程序集上使用bindingRedirect
。同样的错误仍然存在(该二进制文件的旧版本正在解决方案中的另一个项目中使用)。 - 删除
using System.IdentityModel.Tokens.Jwt;
语句,并强烈定义任何依赖此using 语句的对象。有趣的是,在这样做的过程中,我没有在 eg 的声明中收到错误。System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler();
- 然而,我确实在 HttpActionResult 实现的public string ReasonPhrase { get; }
行收到错误must declare a body because it is not marked abstract or extern.
。
上面的第 3 点让我相信 ASP.Net 版本可能存在一些问题导致所有这些怪异(因为上面只是一个简单的 属性...),但我真的不是当然。我已确保目标框架在我的开发环境和在线环境 (.NET Framework 4.5.2) 上是相同的。
对我来说,none 是有道理的,因为在我的开发环境中一切都工作得很好,它建立在与我的在线环境相同版本的 OrchardCMS 上。
我在项目中使用的参考程序集:
System.IdentityModel.Tokens.Jwt
- v5.1.5.0Microsoft.IdentityModel.Tokens
- v5.1.5.0
非常感谢在此问题上的任何帮助 - 这个小问题在很大程度上阻碍了我的进步,我似乎无法解决问题![=26=]
附加信息: 我应该澄清一下,我们在这个问题中提到的 "production" 环境不维护我们的源代码版本。然而,我已经创建了一个单独的测试环境来反映我们的生产环境,并在那里安装了源代码。
请务必注意,通过 Orchard CMS 管理仪表板安装 NuGet 包是加载我们代码的机制。本题之前提到的所有线上环境都是指这个尝试加载这段代码的过程。
当我实际将包作为项目添加到我们的解决方案时,问题没有发生,我们的 web-api 实现在我们的测试环境中工作。
但是,这不是解决方案,因为我们没有也不会在生产环境中维护解决方案源的版本。但是,它可能会为知识渊博的人提供一些关于正在发生的事情的线索?
根据 Orchard's Module Loader documentation - 动态编译在我们的在线环境中仍然启用。我们的参考库有一个问题导致无法编译服务器端。我相信 VS 以某种方式掩盖了这个问题并允许编译仍然离线进行,因为我们的解决方案确实包含正确的参考。