identity-experience-framework 相关问题


Identity Server 4 ROPC 授予自定义声明和刷新令牌

我想知道是否有人可以阐明 Identity Server 4 如何处理资源所有者密码凭证 (ROPC) 授予类型。在我的公司,我们有自己的 Identity Ser 实施...


将子文件夹路由到根 URL

在 Razor Pages 项目中,我必须覆盖 ASP.NET Identity 的默认 UI。除了特定的页面要求之外,我不想要像 /Identity/Account/Whatever 这样的 URL - 我的页面将是 /log...


如何在Spring Boot 3和Spring Framework 6中注册拦截器

我正在使用 Spring Boot 3.1.0-SNAPSHOT 构建后端,它使用 Spring Framework 6x。 拦截器: @Slf4j 公共类 MyInterceptor 实现 HandlerInterceptor { @覆盖 公众嘘声...


Entity Framework Core 7 连接证书信任异常

我最近在开发中升级到 Entity Framework Core 7,但遇到异常,“已成功与服务器建立连接,但在连接过程中发生错误...


Python/sqlite - 插入后选择记录

是否有相当于 INSERT...;SELECT @@IDENTITY 的 sqlite?如果是这样,请告诉我代码或指出它。 谢谢!


C# 图像处理:缩放和文件大小约束 (.NET Framework 4.8)

问题 我正在升级旧版软件(.NET Framework 4.8)以与 API 集成,该 API 以 Base64 编码字符串为所有用户提供图片。我能够获取这个字符串,提取它......


Entity Framework Core“未将对象引用设置为对象的实例”,并在 LINQ 中使用嵌套的 .Any

我有一个使用 Entity Framework Core 1.0.0 的 ASP.NET Core 应用程序。 在特定查询中,我收到“对象引用未设置到对象实例”异常。 查询是


R 的包装函数,带有可选参数[重复]

我有以下包装函数: 绘图.直方图 = 函数(x.var, y.var, pf) { ggplot(aes_string(x.var, y.var), 数据 = pf) + geom_bar(stat="identity", color = "black", fill = "steelblu...


如何访问 NFL 的 API?

我一直在尝试访问或设法访问 NFL.com 的数据,但尚未找到。这些网站上有公开文档: https://api.nfl.com/docs/identity/oauth2/index.html 但是


SharePoint 修补问题

我们在装有 SharePoint Server 2019 的 Microsoft Identity Manager (MIM) Web 服务器上应用了 12 月份的 SharePoint 补丁(KB5002531 和 KB5002532)。修补后,我们看到以下错误“The con...”


Entity Framework .NET 8 将数据保存为 JSON 对象

我想像这样在SQL Server中保存数据: 准备 : [ "访问前查看客户数据": "5", “setSmartObjectivesForVisit”:“5”,...


如何向表中插入N行默认值

我有一个表,其中包含标识列以及表示创建日期的列: 创建表 dbo.OrderStatus ( OrderStatusId int IDENTITY(1, 1) NOT NULL, 创建日期日期...


在 SonarQube 的安全热点中收到警告,确保此处安全控制

ClaimsPrincipal 主体 = new ClaimsPrincipal(identity); 控制权限是安全敏感的。它在过去导致了以下漏洞: CVE-2018-12999 CVE-2018-10...


"message": "方法 Illuminate\Auth\SessionGuard::factory 不存在。",

我正在尝试使用 "tymon/jwt-auth": "^1.0" 将 JWT 添加到 Laravel Framework 7.26.1。已按照文档设置一切。 https://jwt-auth.readthedocs.io/en/develop/quick-start/...


如何使用闭包表遍历树结构以便在 Eloquent 模型中创建 json?

在我的应用程序中,我有下表: 创建表文件( id bigint IDENTITY(1,1) NOT NULL, 名称 nvarchar(255) 整理 SQL_Latin1_General_CP1_CI_AS NOT NULL, 文件夹 bigint NUL...


如何在 PostgreSQL 的 phinx 中将 'id' 设置为大整数并自动增量?

我尝试仅设置为biginter,但它失去了自动增量属性。所以我也尝试添加自动增量。 $table->changeColumn('id', 'biginteger', ['identity' => true])->update()...


使用匿名Cognito身份将文件上传到S3

我有一个 iOS 客户端,可以使用匿名 Cognito Identity 和 Amplify SDK 成功将文件上传到 S3。 现在我尝试使用 CLI 模拟相同的上传,但失败了...


比较两个向量之间的 NA 的 R 方法

我正在尝试比较两个向量的相同元素,例如下面的向量 a 和 b。 # 向量 a 和 b 一个<- c(1, 2, 3, NA) b <- c(1, 3, NA, NA) # compare for identity a == b ## [1] TRUE


IIS 找不到带有主题的有效证书

我在本地 IIS 服务器上使用 Identity Server 选项部署 ASP.NET Angular SPA 模板 RC2 应用程序。我得到以下异常。 IIS 无法访问我的本地认证信息。 应用程序: w3wp.exe


NodeJS 将 Dto 映射到 TypeORM 实体

我有一个运行nestjs框架的nodejs REST API后端,使用typeORM作为我的实体的ORM。 来自 C#/Entity Framework 背景,我非常习惯将 Dtos 映射到数据...


为什么 EFCore 6 不再在 iOS 上运行?

我在使用 .net6 构建的 iOS 应用程序上使用 Entity Framework Core 6。它曾经适用于旧版本(EF 和 .net),但现在我收到以下错误: 系统。


在 GKE (.NET) 中使用 Workload Identity 时无法获取访问令牌

我已在 GKE 集群上设置了工作负载身份,现在我使用链接到具有适当权限的 IAM SA 的 Kubernetes SA。我检查过,当我使用 IAM SA 密钥文件时,它会得到


Entity Framework Core 7 外键

我的实体中有一个外键“string ParamName”,它指的是ParamDesc实体。我怎样才能使这个外键不严格?我的意思是,我希望我的外键可以包含任何值,甚至......


使用 Google Workload Federation Identity 对本地应用程序进行身份验证

我们在本地服务器中有一个正在运行的应用程序。我想创建一个从 GCP 读取 BigQuery 表的应用程序。 我被限制使用服务帐户密钥,但这不是......


如何使用 Rider IDE 将身份脚手架添加到 ASP.NET CORE 应用程序

我正在观看有关 ASP.NET CORE Identity 的教程,其中讲师通过使用 Visual Studio 搭建脚手架来添加身份,但现在我正在使用 Rider IDE,但我没有看到这样的选项,。 ..


Entity Framework 6.1 - 使用 INCLUDE 语句创建索引

既然索引在实体框架 6.1 的最新测试版本中可用,是否有可能在代码优先方法中创建与此 SQL 语句相同的索引? 创建非簇...


.NET 6 连接到 Windows 会话切换

我正在将一个应用程序从 .NET Framework 迁移到 .NET 6。它在内部启动 Kestrel Web 服务器,并且旨在作为 Windows 服务运行 - 在使用 Topshelf li 实现的旧版本中...


使用 EF Core 和 GraphQL 在 ASP.NET Core 中保留唯一的连续组编号

我正在使用 ASP.NET Core Minimal API (.NET 7) 和 Entity Framework Core、HotChocolate(用于 GraphQL)和 Microsoft SQL Server 数据库开发 API 后端。我遇到了一个特定的挑战...


Azure 应用程序注册:IdentifierUris 属性的值必须使用经过验证的组织域或其子域

已验证的发布者:我在 Azure AD 中有一个应用程序,并且在品牌和属性下验证了发布者(我必须托管文件 .well-known/microsoft-identity-association.json)。 已验证


使用 Entity Framework Core 6 对表的子集应用逆向工程

我正在开发 ASP.NET Core Web API (.NET 6),我想仅对某些表应用逆向工程。因为数据库相当广泛,我不需要所有的表,只需要一些


不支持关键字:“服务器”。旧的Asp.Net系统

我有一个使用 .Net Framework 4.0、ASP.Net、EntityFramework、C# 和 SQL Server 2014 的旧系统。 我在尝试运行系统时不断收到错误消息,它以前可以工作! - “服务器错误...


无法使用Robot Framework的“输入文本”关键字输入卡号

我是机器人框架的新手。 在卡号文本字段中输入卡号时,仅输入前 4 位数字。要输入其余数字,我必须使用“输入...


在 XCFramework 中难以访问 Swift Framework 中的 Objective-C 类

我有一个 Swift 框架,我想添加一个 Objective C 包装器以从 Objective C 项目进行访问(出于某种原因,这是要求)。 我已经封装了 Swift 类以支持 Objec...


ASP.Net Core 容器在自定义端口 8080 上运行,但 ASP.Net 容器在 Docker Windows 中在固定端口 80 上运行

我根据以下图片制作了两个容器: ASP.NET核心 mcr.microsoft.com/dotnet/aspnet:8.0.0-windowsservercore-ltsc2019 网络应用程序 来自 mcr.microsoft.com/dotnet/framework/aspnet:4.8-windowsserv...


为什么这个API请求不能正常工作

我使用 Django-REST Framework 开发了一个 API,并尝试将其与我的前端连接。 我有一个终点来获得最后四名获胜者,当我尝试时它工作正常 异步函数


由于 URL 构造不正确(404 Not Found),React 组件未显示获取的数据

我正在开发一个 React 组件,以使用 Axios 从 Django REST Framework API 获取数据。但是,该组件没有显示获取的数据,并且我遇到了 404 Not Found 错误...


导出到 .framework 的 Kotlin 多平台库在 Xcode 上崩溃

我正在尝试使用 Kotlin Multiplatform 实现一个库以在我的 iOS 项目中使用,因此我下载了官方库模板,它实现了斐波那契数列。 我只做了 2 处更改


不支持关键字:“服务器”。旧的 ASP.NET Web 表单系统

我有一个使用 .NET 4.0、ASP.NET、Entity Framework、C# 和 SQL Server 2014 的旧系统。 我在尝试运行系统时不断收到此错误,它以前可以工作! “/”应用程序中的服务器错误...


在 .NET Framework 应用程序中使用 TableAdapter 更新数据失败

在 Visual studio 2022 中,我创建了一个 VB 表单,与 SQL 中的表连接。 我可以在表中添加新记录但不能更新。这是代码 Private Sub ButtonUpdate_Click(发送者作为对象,e作为


Entity Framework Core:如果我们永远不会恢复迁移,删除 Migration.Designer.cs 是否安全?

我们有一个包含约 200 个表的数据库架构。 为每次迁移创建的模型快照 (Migration.Designer.cs) 约为 20K 行。因此,进行大量迁移确实会减慢我们的速度...


获取 API 请求工作正常。发布请求返回缺少 CSRF 令牌,但它在那里

我有一个 Django 网站(带有标准视图),用于注册和登录。登录后,您可以转到从 Django Rest Framework 后端获取数据的 Vue 应用程序。我正在使用会话


新的 Microsoft Azure 机器人“在 Web 聊天中测试”错误:将此消息发送到您的机器人时出错:HTTP 状态代码 InternalServerError 500

我设置了一个新的单租户 Azure Bot,并使用 CI/CD 管道将 Bot Framework 解决方案部署到 azure Web 应用程序。我正在使用开箱即用的 Bot Builder 模板“Core Bot with Test”...


在 .NET 6 中使用 xsltc.exe 生成的程序集(XSLT 样式表)

我有一个 XSLT 样式表“Stylesheet.xsl”,我已使用 xsltc.exe 将其编译为“Stylesheet.dll” 该 DLL 包含在我的 .NET 6 中(net6.0 我有一个 XSLT 样式表“Stylesheet.xsl”,我已使用 xsltc.exe 将其编译为“Stylesheet.dll” 该 DLL 包含在我的 .NET 6 (<TargetFramework>net6.0</TargetFramework>) 项目中,用法如下: var xslCompiledTransform = new XslCompiledTransform(); xslCompiledTransform.Load(typeof(Stylesheet)); // ↑ System.IO.FileNotFoundException: Could not load file or assembly 'System.Data.SqlXml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified. xslCompiledTransform.Transform(@"..\..\..\input.xml", @"..\..\..\output.xml"); Load方法抛出FileNotFoundException,并显示消息“无法加载文件或程序集‘System.Data.SqlXml,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089’。系统找不到指定的文件。 ” 关于 xsltc.exe 的文档说明了以下内容: 脚本块仅在 .NET Framework 中受支持。 .NET Core 或 .NET 5 或更高版本不支持它们。 这严重暗示使用 xsltc.exe 编译的样式表应该在 .NET Core 或 .NET 5 或更高版本上工作(当不使用脚本块时),但在我的测试中却不起作用。 有谁知道为什么使用 xsltc.exe 编译的样式表不适用于 .NET 6 以及如何解决此问题? 更多详情 我在下面添加了有关我尝试过的更多详细信息。 请注意,我使用的样式表Stylesheet.xsl非常基本,没有使用特殊功能:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:template match="/"> <output> <xsl:for-each select="input/book"> <booktitle> <xsl:value-of select="@title" /> </booktitle> </xsl:for-each> </output> </xsl:template> </xsl:stylesheet> 生成DLL的命令: "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\xsltc.exe" Stylesheet.xsl 在 SDK 样式的 .csproj 文件中引用 DLL: <ItemGroup> <Reference Include="Stylesheet"> <HintPath>.\Stylesheet.dll</HintPath> </Reference> </ItemGroup> input.xml:<input> <book title="First Title" /> <book title="Second Title" /> </input> output.xml 使用未编译的样式表执行转换时:<output> <booktitle>First Title</booktitle> <booktitle>Second Title</booktitle> </output> 我已经研究并发现其他人也有同样的问题,但还没有找到解决方案或解释为什么 Microsoft 文档隐式声明它应该可以工作,而在我的测试中却不起作用。 https://github.com/dotnet/runtime/issues/68129 在.NET Core 2.2中使用xsltc.exe生成的程序集? XslCompiledTransform.Load(type):无法加载文件或程序集“System.Data.SqlXml” System.IO.FileNotFoundException的堆栈跟踪: at System.Delegate.BindToMethodInfo(Object target, IRuntimeMethodInfo method, RuntimeType methodType, DelegateBindingFlags flags) at System.Reflection.RuntimeMethodInfo.CreateDelegateInternal(Type delegateType, Object firstArgument, DelegateBindingFlags bindingFlags) at System.Reflection.RuntimeMethodInfo.CreateDelegate(Type delegateType) at System.Xml.Xsl.XslCompiledTransform.Load(MethodInfo executeMethod, Byte[] queryData, Type[] earlyBoundTypes) at System.Xml.Xsl.XslCompiledTransform.Load(Type compiledStylesheet) at TestXslDotnet6.Program.Main(String[] args) in C:\Users\UserNameRedacted\Path\To\Repo\TestXslDotnet6\TestXslDotnet6\Program.cs:line 10 根据 GitHub 问题 .NET 6 不支持 XslCompiledTransform.Load(type(myXsltCompiled_dll)) 中的信息,看起来好像不支持,也不会支持。 2022年4月18日的评论说: 程序集 System.Data.SqlXml 包含命名空间 System.Xml.Xsl.Runtime,该命名空间在 .NET Core 中不存在。 根据移植指南,msxsl:script 在 .NET Core 上不可用。 .NET Framework 特定教程预计不起作用。 第二个人评论: 看起来 System.Data.SqlXml 是 SQLXML 的一部分,属于 据我所知,SQL Server org 不支持 .NET Core。 第三个人回复: 目前没有关于 SQLXML 和对 .NET 5+ 支持的计划, 我们还没有听到很多这方面的请求。我会 建议在此处开放用户声音以获得一些吸引力并 关于该主题的共识:https://aka.ms/sqlfeedback 所以,这就是您的答案:“msxsl:script 在 .NET Core 上不可用。.NET Framework 特定教程预计不起作用。”原因是非 .NET 组织必须使其成为可能,但没有计划这样做。他们没有意识到需求。 而且,他们承认该文档具有误导性。似乎在 2022 年 5 月对文档进行了更改,并创建了拉取请求:请注意,XSLT 脚本块仅限 .NET Framework。 我认识到这并没有为您提供解决方案或前进的道路,这令人失望。但这就是您问题的答案:.NET 6.0 根本不支持以这种方式进行转换。 虽然距离这个问题大约有两年了,但我还是想分享一下我为自己的目的所做的解决方法,因为我没有找到任何其他解决方案,可以帮助在基于 .NET Core 的转换中使用编译的 xslt dll。 因此,如果您想将 XslCompiledTransform 类与通过 xlstc.exe 生成的 dll 类型一起使用,请按照以下步骤操作: 生成dll类 xsltc.exe /class:Transform /out:Your.Assembly.dll 将 dll 反汇编为 ILL 代码 ildasm Your.Assembly.dll /out=Your.Assembly.ill 将 Your.Assembly.ill 中所有出现的 [System.Data.SqlXml] 替换为 [System.Private.Xml] 将你的IL编译回dll ilasm Your.Assembly.ill /dll 现在您可以将 Your.Assembly.dll 引用添加到您的 .NET Core 项目


引导进度条没有进度

引导进度条在我的 MVC 索引视图上不起作用。 我已经用 Chrome 和 Internet Explorer 尝试过了。 @{ ViewBag.Title = "首页"; } 引导进度条在我的 MVC 索引视图上不起作用。 我已经用 Chrome 和 Internet Explorer 尝试过了。 @{ ViewBag.Title = "Home Page"; } <div class="jumbotron"> <h1>ASP.NET</h1> <p class="lead">ASP.NET is a free web framework for building great Web sites and Web applications using HTML, CSS and JavaScript.</p> <p><a href="http://asp.net" class="btn btn-primary btn-large">Learn more &raquo;</a></p> </div> <div class="row"> <div class="col-md-4"> <h2>Getting started</h2> <div class="progress-bar progress-striped "></div> </div> </div> 本次聚会迟到了,但在我使用的 Bootstrap 版本(v3.1.1)中,该类是“progress-striped”(不是像文档所说的“progress-bar-striped”),并且它和“active” ' 类必须应用于外部 div: <div class="progress progress-striped active"> <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">Some text</div> </div> 查看 CSS,选择器“progress-bar”已更改为“bar”: ./bootstrap.css: .progress { ... } .progress .bar { ... } 因此,将您的代码更改为 <div class="progress"> <div class="bar"> </div> </div> 然后就可以了。 不确定这种疯狂的原因是什么,似乎引导文档还没有更新。 <div class="progress"> <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="75" aria-valuemin="0" aria-valuemax="100" style="width: 75%"></div> </div> 这样进度动画就可以工作了。 <div class="progress"> <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;"> <span class="sr-only">60% Complete</span> </div> </div> 上面是 bootstrap v3.1.1 的代码,看起来你的进度条 div 缺少一些元素? 如果您使用 Bootstrap v4 并且需要动画,则需要使用 progress-bar-animated 而不是 active。


MVC ASP.NET Core Identity,创建登录、注册操作。 AuthController

公共类AuthController:控制器 { SignInManager _signInManager { 获取; } UserManager _userManager { 获取; } 角色管理器 public class AuthController : Controller { SignInManager<AppUser> _signInManager { get; } UserManager<AppUser> _userManager { get; } RoleManager<IdentityRole> _roleManager { get; } public AuthController(SignInManager<AppUser> signInManager, UserManager<AppUser> userManager, RoleManager<IdentityRole> roleManager) { _signInManager = signInManager; _userManager = userManager; _roleManager = roleManager; } public IActionResult Login() { return View(); } [HttpPost] public async Task<IActionResult> Login(string? returnUrl,LoginVM vm) { AppUser user; if (!ModelState.IsValid) { return View(vm); } if (vm.UsernameOrEmail.Contains("@")) { user = await _userManager.FindByEmailAsync(vm.UsernameOrEmail); } else { user = await _userManager.FindByNameAsync(vm.UsernameOrEmail); } if (user == null) { ModelState.AddModelError("", "Username or password is wrong"); return View(vm); } var result = await _signInManager.PasswordSignInAsync(user, vm.Password, vm.IsRemember, true); if (!result.Succeeded) { if (result.IsLockedOut) { ModelState.AddModelError("", "Too many attempts wait until " + DateTime.Parse(user.LockoutEnd.ToString()).ToString("HH:mm")); } else { ModelState.AddModelError("", "Username or password is wrong"); } return View(vm); } if (returnUrl != null) { return LocalRedirect(returnUrl); } return RedirectToAction("Index","Home"); } public IActionResult Register() { return View(); } [HttpPost] public async Task<IActionResult> Register(RegisterVM vm) { if (!ModelState.IsValid) { return View(vm); } var user = new AppUser { Fullname = vm.Fullname, Email = vm.Email, UserName = vm.Username }; var result = await _userManager.CreateAsync(user, vm.Password); if (!result.Succeeded) { foreach (var error in result.Errors) { ModelState.AddModelError("", error.Description); } return View(vm); } var roleResult = await _userManager.AddToRoleAsync(user, Roles.Member.ToString()); if (!roleResult.Succeeded) { ModelState.AddModelError("", "Something went wrong. Please contact admin"); return View(vm); } return View(); } public async Task<IActionResult> Logout() { await _signInManager.SignOutAsync(); return RedirectToAction("Index", "Home"); } public async Task<bool> CreateRoles() { foreach (var item in Enum.GetValues(typeof(Roles))) { if (!await _roleManager.RoleExistsAsync(item.ToString())) { var result = await _roleManager.CreateAsync(new IdentityRole { Name = item.ToString() }); if (!result.Succeeded) { return false; } } } return true; } } } 所以,我在代码中搞乱了登录、注册和注销,现在这个 RoleManager 的事情让我摸不着头脑。我只是想为我的管理员用户提供一些额外的权力,但我有点不知道该怎么做。如果您能用简单的语言解释步骤或需要进行哪些更改来帮助我,那就太棒了。 我的目标是让管理员用户在我的系统中体验更好,您对此的建议非常有用。尝试了解 RoleManager 的事情以及如何为我的管理员用户提供更多能力。您直接的帮助可能会对我解决这个问题产生很大的影响! 定义管理员角色 创建管理员用户 更新注册流程: var roleResult =等待_userManager.AddToRoleAsync(用户,vm.IsAdmin? Roles.Admin.ToString() : Roles.Member.ToString()); 使用管理员角色: [授权(角色=“管理员”)] 公共 IActionResult AdminDashboard() { // 特定于管理的逻辑 } 5.提升管理能力: if (User.IsInRole("管理员")) { // 特定于管理的逻辑 } 中间件配置: services.AddIdentity() .AddRoles() .AddEntityFrameworkStores(); 7.创建角色方法: 公共无效配置(IApplicationBuilder 应用程序,IHostingEnvironment env) { // 其他中间件配置 // Create roles during application startup var authController = new AuthController(/* inject your dependencies here */); authController.CreateRoles().GetAwaiter().GetResult(); }


为什么springinitializr让项目继承spring-boot-starter-parent而不是使用spring-boot-dependency

当使用 spring initalizr 创建项目时,pom.xml 继承自 spring-boot-starter-parent: 当使用 spring initalizr 创建项目时,pom.xml继承自spring-boot-starter-parent: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> 与在spring-boot-dependencies中指定<dependencyManagement/>相比,这似乎不太灵活,因为如果我们需要使用生成的结构作为多模块项目的子模块,或者使用公司范围的父模块,我们需要将BOM移动到提到的部分: <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 使用 spring-boot-starter-parent 作为父级而不是在创建时立即声明 <dependencyManagement/> 部分是否有任何具体原因? 有人投票决定关闭问题,坚称这是基于意见的,但事实并非如此。 插件配置的存在(顺便说一句,乍一看这些配置的目的是为了修复maven插件的一些“小故障”,但是,其中一些配置不再需要了,例如:https://github.com/maven-plugin)。 com/JetBrains/kotlin/pull/1501)并不是以下之间的唯一区别: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> 和 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 在第一种情况下,maven 项目通过父子关系继承 dependencyManagement,因此,由于 spring-boot 团队通过 properties 部分定义依赖项版本,子项目也可以通过 properties 部分覆盖依赖项版本,例如如果我们的目标是更改 spring-framework 的版本而不更改 spring-boot 的版本,我们可以定义如下内容: <properties> <spring-framework.version>6.0.15</spring-framework.version> </properties> 这显然在第二个配置的情况下不起作用 - maven 只是从 independentBoM 导入 dependencyManagement 部分。 尚不清楚哪种方法“更灵活”(我们更愿意同时避开这两种方法),但是它们与依赖管理的角度也不同。


在 C# 中将 Task<T> 转换为 Task<object>,无需 T

我有一个充满扩展方法的静态类,其中每个方法都是异步的并返回一些值 - 像这样: 公共静态类 MyContextExtensions{ 公共静态异步任务 我有一个充满扩展方法的静态类,其中每个方法都是异步的并返回一些值 - 像这样: public static class MyContextExtensions{ public static async Task<bool> SomeFunction(this DbContext myContext){ bool output = false; //...doing stuff with myContext return output; } public static async Task<List<string>> SomeOtherFunction(this DbContext myContext){ List<string> output = new List<string>(); //...doing stuff with myContext return output; } } 我的目标是能够从另一个类中的单个方法调用这些方法中的任何一个,并将其结果作为对象返回。它看起来像这样: public class MyHub: Hub{ public async Task<object> InvokeContextExtension(string methodName){ using(var context = new DbContext()){ //This fails because of invalid cast return await (Task<object>)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context); } } } 问题是转换失败。我的困境是我无法将任何类型参数传递给“InvokeContextExtension”方法,因为它是 SignalR 中心的一部分并且由 javascript 调用。在某种程度上,我不关心扩展方法的返回类型,因为它只会序列化为 JSON 并发送回 javascript 客户端。但是,我确实必须将 Invoke 返回的值转换为任务才能使用等待运算符。我必须为该“任务”提供一个通用参数,否则它将把返回类型视为 void。因此,这一切都归结为如何成功地将具有通用参数 T 的任务转换为具有对象通用参数的任务,其中 T 表示扩展方法的输出。 您可以分两步完成 - await使用基类执行任务,然后使用反射或dynamic收获结果: using(var context = new DbContext()) { // Get the task Task task = (Task)typeof(MyContextExtensions).GetMethod(methodName).Invoke(null, context); // Make sure it runs to completion await task.ConfigureAwait(false); // Harvest the result return (object)((dynamic)task).Result; } 这是一个完整的运行示例,它将上述通过反射调用 Task 的技术置于上下文中: class MainClass { public static void Main(string[] args) { var t1 = Task.Run(async () => Console.WriteLine(await Bar("Foo1"))); var t2 = Task.Run(async () => Console.WriteLine(await Bar("Foo2"))); Task.WaitAll(t1, t2); } public static async Task<object> Bar(string name) { Task t = (Task)typeof(MainClass).GetMethod(name).Invoke(null, new object[] { "bar" }); await t.ConfigureAwait(false); return (object)((dynamic)t).Result; } public static Task<string> Foo1(string s) { return Task.FromResult("hello"); } public static Task<bool> Foo2(string s) { return Task.FromResult(true); } } 一般来说,要将 Task<T> 转换为 Task<object>,我会简单地采用简单的连续映射: Task<T> yourTaskT; // .... Task<object> yourTaskObject = yourTaskT.ContinueWith(t => (object) t.Result); (文档链接在这里) 但是,您实际的具体需求是 通过反射调用 Task 并获取其(未知类型)结果 。 为此,您可以参考完整的dasblinkenlight的答案,它应该适合您的具体问题。 我想提供一个实现,恕我直言,这是早期答案的最佳组合: 精确的参数处理 无动态调度 通用扩展方法 给你: /// <summary> /// Casts a <see cref="Task"/> to a <see cref="Task{TResult}"/>. /// This method will throw an <see cref="InvalidCastException"/> if the specified task /// returns a value which is not identity-convertible to <typeparamref name="T"/>. /// </summary> public static async Task<T> Cast<T>(this Task task) { if (task == null) throw new ArgumentNullException(nameof(task)); if (!task.GetType().IsGenericType || task.GetType().GetGenericTypeDefinition() != typeof(Task<>)) throw new ArgumentException("An argument of type 'System.Threading.Tasks.Task`1' was expected"); await task.ConfigureAwait(false); object result = task.GetType().GetProperty(nameof(Task<object>.Result)).GetValue(task); return (T)result; } 您不能将 Task<T> 转换为 Task<object>,因为 Task<T> 不是协变的(也不是逆变的)。最简单的解决方案是使用更多反射: var task = (Task) mi.Invoke (obj, null) ; var result = task.GetType ().GetProperty ("Result").GetValue (task) ; 这很慢且效率低下,但如果不经常执行此代码则可用。顺便说一句,如果您要阻塞等待其结果,那么异步 MakeMyClass1 方法有什么用呢? 另一种可能性是为此目的编写一个扩展方法: public static Task<object> Convert<T>(this Task<T> task) { TaskCompletionSource<object> res = new TaskCompletionSource<object>(); return task.ContinueWith(t => { if (t.IsCanceled) { res.TrySetCanceled(); } else if (t.IsFaulted) { res.TrySetException(t.Exception); } else { res.TrySetResult(t.Result); } return res.Task; } , TaskContinuationOptions.ExecuteSynchronously).Unwrap(); } 它是非阻塞解决方案,将保留任务的原始状态/异常。 最有效的方法是自定义等待者: struct TaskCast<TSource, TDestination> where TSource : TDestination { readonly Task<TSource> task; public TaskCast(Task<TSource> task) { this.task = task; } public Awaiter GetAwaiter() => new Awaiter(task); public struct Awaiter : System.Runtime.CompilerServices.INotifyCompletion { System.Runtime.CompilerServices.TaskAwaiter<TSource> awaiter; public Awaiter(Task<TSource> task) { awaiter = task.GetAwaiter(); } public bool IsCompleted => awaiter.IsCompleted; public TDestination GetResult() => awaiter.GetResult(); public void OnCompleted(Action continuation) => awaiter.OnCompleted(continuation); } } 具有以下用法: Task<...> someTask = ...; await TaskCast<..., object>(someTask); 这种方法的局限性在于结果不是 Task<object> 而是一个可等待的对象。 我根据dasblinkenlight的回答做了一个小小的扩展方法: public static class TaskExtension { public async static Task<T> Cast<T>(this Task task) { if (!task.GetType().IsGenericType) throw new InvalidOperationException(); await task.ConfigureAwait(false); // Harvest the result. Ugly but works return (T)((dynamic)task).Result; } } 用途: Task<Foo> task = ... Task<object> = task.Cast<object>(); 这样您就可以将 T 中的 Task<T> 更改为您想要的任何内容。 对于最佳方法,不使用反射和动态丑陋语法,也不传递泛型类型。我将使用两种扩展方法来实现这个目标。 public static async Task<object> CastToObject<T>([NotNull] this Task<T> task) { return await task.ConfigureAwait(false); } public static async Task<TResult> Cast<TResult>([NotNull] this Task<object> task) { return (TResult) await task.ConfigureAwait(false); } 用途: Task<T1> task ... Task<T2> task2 = task.CastToObject().Cast<T2>(); 这是我的第二种方法,但不推荐: public static async Task<TResult> Cast<TSource, TResult>([NotNull] this Task<TSource> task, TResult dummy = default) { return (TResult)(object) await task.ConfigureAwait(false); } 用途: Task<T1> task ... Task<T2> task2 = task.Cast((T2) default); // Or Task<T2> task2 = task.Cast<T1, T2>(); 这是我的第三种方法,但是不推荐:(类似于第二种) public static async Task<TResult> Cast<TSource, TResult>([NotNull] this Task<TSource> task, Type<TResult> type = null) { return (TResult)(object) await task.ConfigureAwait(false); } // Dummy type class public class Type<T> { } public static class TypeExtension { public static Type<T> ToGeneric<T>(this T source) { return new Type<T>(); } } 用途: Task<T1> task ... Task<T2> task2 = task.Cast(typeof(T2).ToGeneric()); // Or Task<T2> task2 = task.Cast<T1, T2>(); 将 await 与动态/反射调用混合使用并不是一个好主意,因为 await 是一条编译器指令,它会围绕调用的方法生成大量代码,并且使用更多反射来“模拟”编译器工作并没有真正的意义,延续、包装等 因为您需要的是在运行时管理代码,然后忘记在编译时工作的 asyc await 语法糖。重写 SomeFunction 和 SomeOtherFunction 而不使用它们,并在运行时创建的您自己的任务中开始操作。您将得到相同的行为,但代码非常清晰。


© www.soinside.com 2019 - 2024. All rights reserved.