问题标签 [asp.net-core-3.1]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
28272 浏览

.net - 表单提交导致“InvalidDataException:超出表单值计数限制 1024”。

我创建了一个 mvc 站点,并将大量 json 表单数据 ( Content-Type:application/x-www-form-urlencoded) 发布回 mvc 控制器。当我这样做时,我收到一个 500 响应,指出:“InvalidDataException:超出表单值计数限制 1024。”

在以前版本的 aspnet 中,您可以将以下内容添加到 web.config 以增加限制:

当我将这些值放入 web.config 时,我看不到任何变化,所以我猜测 Microsoft 不再从 web.config 中读取这些值。但是,我不知道应该在哪里设置这些设置。

非常感谢任何有关增加表单值计数的帮助!

需要明确的是,当我的帖子数据中的项目数少于 1024 时,此请求可以正常工作。

更新: 在 asp.net MVC Core 3.1 中,错误消息是 - “无法读取请求表单。超出表单值计数限制 1024。”

0 投票
1 回答
7189 浏览

c# - 使用 ASP.NET Core 2.1 / 3+ Identity 验证身份验证 cookie

在 ASP.NET Core 2 中使用 Cookie 身份验证(带有或不带有Identity)时,可能会发生用户的电子邮件或姓名被更改,甚至在 cookie 的生命周期内帐户被删除的情况。这就是文档指出应该验证 cookie 的原因。文档中的示例注释为

此处描述的方法会在每个请求上触发。这可能会导致应用程序的性能大幅下降。

所以我想知道验证 cookie 主体的最佳模式是什么。我所做的Startup.cs是订阅该OnValidatePrincipal事件并检查主体的有效性,例如每 5 分钟通过LastValidatedOn向 cookie 附加一个声明,如下所示:

0 投票
2 回答
2207 浏览

asp.net-core-webapi - 如何从 Web API 调用 IdentityServer UserManager 方法?

我需要从我的 web api 启动密码重置。我分别有身份服务器应用程序和 Web api 应用程序。我使用 OIDC 客户端与身份服务器进行通信。使用这个客户端,我只能调用登录、注销和一些标准方法。

我需要的是生成密码重置令牌并在 API 中获取重置令牌。

我试图'Microsoft.Extensions.Identity.Core'在我的 webapi 核心层中包含所有实体。但我明白了

尝试激活“Microsoft.AspNetCore.Identity.UserManager”时无法解析类型 Microsoft.AspNetCore.Identity.IUserStore1[Application.Core.Entities.User] 的服务

代码

我也尝试在启动注入中添加以下代码 services.AddScoped<UserManager<User>, UserManager<User>>();

在我的 web api 中注入 UserManager 的正确方法是什么?

0 投票
1 回答
1477 浏览

c# - 如何将 ModelExpression 绑定到 ASP.NET Core 中的 ViewComponent?

我想将模型表达式(例如属性)绑定到视图组件——就像我使用 HTML 助手(例如,@Html.EditorFor())或标签助手(例如,<partial for />)一样——并在视图中重用这个模型带有嵌套的 HTML 和/或标签助手。我能够将 a 定义ModelExpression为视图组件上的参数,并从中检索许多有用的元数据。除此之外,我开始遇到障碍:

  • 如何将底层源模型中继并绑定到例如asp-for标签助手?
  • 如何确保ViewData.ModelMetadata尊重属性元数据(例如验证属性)?
  • 我如何组装一个完全合格 HtmlFieldPrefix的字段name属性?

我在下面提供了一个(简化的)场景,其中包含代码和结果——但代码暴露的未知数多于答案。众所周知,许多代码是不正确的,但我将其包括在内,因此我们可以有一个具体的基线来评估和讨论替代方案。

设想

列表的值<select>需要通过数据存储库填充。假设将可能的值填充为例如原始视图模型的一部分是不切实际或不可取的(参见下面的“替代选项”)。

示例代码

/Components/SelectListViewComponent.cs

笔记

  • usingModelExpression不仅允许我使用模型表达式调用视图组件,而且还通过反射为我提供了许多有用的元数据,例如验证参数。
  • 参数名称for在 C# 中是非法的,因为它是保留关键字。因此,我改为使用aspFor,它将以asp-for. 这有点小技巧,但为开发人员提供了一个熟悉的界面。
  • 显然,_repository代码和逻辑会随着实现的不同而有很大的不同。在我自己的用例中,我实际上是从一些自定义属性中提取参数。
  • GetFullHtmlFieldName()不构造完整的HTML 字段名称;它总是返回我提交给它的任何值,这只是模型表达式名称。更多关于这在下面的“问题”下。

/Models/SelectViewModel.cs

笔记

  • 从技术上讲,在这种情况下,我可以直接返回SelectList视图,因为它将处理当前值。但是,如果您将模型绑定到您<select>asp-for标签助手,那么它将自动启用multiple,这是绑定到集合模型时的默认行为。

/Views/Shared/Select/Default.cshtml

笔记

  • 从技术上讲, for 的值@Model将返回SelectViewModel。如果这是一个<input />那将是显而易见的。由于SelectList识别出正确的值(大概来自ViewData.ModelMetadata.
  • 我可以改为将 设置为aspFor.Model例如UnderlyingModel. SelectViewModel这将导致 HTML 字段名称为{HtmlFieldPrefix}.UnderlyingModel— 并且仍然无法从原始属性中检索任何元数据(例如验证属性)。

变化

如果我不设置HtmlFieldPrefix, 并将视图组件放置在例如 a<partial for />或的上下文中,@Html.EditorFor()那么字段名称将是正确的,因为HtmlFieldPrefix在父上下文中定义。但是,如果我将它直接放在顶级视图中,由于HtmlFieldPrefix未定义,我将收到以下错误:

ArgumentException:HTML 字段的名称不能为 null 或为空。而是使用带有非空 htmlFieldName 参数值的 Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper.Editor 或 Microsoft.AspNetCore.Mvc.Rendering.IHtmlHelper``1.EditorFor 方法。(参数“表达式”)

问题

  • HtmlFieldPrefix没有正确填充完全限定的值。例如,如果模型属性名称为Country,它将始终返回Country,即使实际模型路径是ShippingAddress.CountryAddresses[2].Country
  • jQuery Validation Unobtrusive功能没有触发。例如,如果 this 绑定到的属性被标记为[Required]then 此处不会被标记。这大概是因为它被绑定到SelectViewModel,而不是父属性。
  • 原始模型不会以任何方式传递给视图组件的视图;SelectList能够从 中推断出原始值,ViewData但这在视图中丢失了。我可以aspFor.Model通过视图模型传递,但它无法访问原始元数据(例如验证属性)。

备用选项

我考虑过的其他一些选项,但在我的用例中被拒绝了。

  • 标签助手:这很容易通过标签助手实现。将依赖项(例如存储库)注入标签助手不太优雅,因为没有一种方法可以通过组合根实例化标签助手,就像使用IViewComponentActivator.
  • 控制器:在这个简化的示例中,还可以在顶级视图模型上定义源集合,紧挨着实际属性(例如,Country对于值,CountryList对于选项)。在更复杂的示例中,这可能不实用或不优雅。
  • AJAX:可以通过对 Web 服务的 JavaScript 调用检索值,将 JSON 输出绑定到<select>客户端上的元素。我在其他应用程序中使用这种方法,但这里不希望这样做,因为我不想将所有潜在的查询逻辑暴露给公共接口。
  • 显式值:我可以显式地传递模型以及ModelExpression在视图组件下重新创建父上下文。这有点麻烦,所以我想先解决这个问题ModelExpression

以前的研究

这个问题之前已经被问过(并回答过):

然而,在这两种情况下,接受的答案(一个由 OP 提供)都没有完全探索问题,而是决定标签助手更适合他们的场景。标签助手很棒,并且有其目的;但是,对于视图组件更合适的场景(例如依赖于外部服务),我想充分探讨原始问题。

我在追兔子到洞里吗?或者社区对模型表达式的更深入理解可以解决哪些选项?

0 投票
4 回答
5109 浏览

visual-studio - 从 Visual Studio 2019 将 ASP.NET Core 3.1 站点发布到 Azure 时出错

我有一个预先存在的ASP.NET Core 3.0应用程序,它已成功部署到Azure 应用服务(使用AspNetCoreModuleV2模块)。将应用程序升级到(今天的版本)ASP.NET Core 3.1后,应用程序可以在我的本地版本的IIS Express上正确构建和运行。但是,当我尝试使用(今天的版本)Visual Studio 16.4发布到 Azure App Service时,我收到以下错误:

资产文件“C:\Project\obj\project.assets.json”没有“.NETCoreApp,Version=v3.0”的目标。确保恢复已运行,并且您已在项目的 TargetFrameworks 中包含“netcoreapp3.0”。

笔记

  • 全部<PackageReference>Microsoft.AspNetCore, Microsoft.EntityFrameworkCore, 并且Microsoft.Extensions已经更新到3.1.0
  • 我已经清理了我的解决方案,甚至删除了我的obj文件夹以确保没有任何挥之不去的引用。
  • 3.1.100此错误是从Microsoft.PackageDependencyResolution.targets.

我知道有些东西仍然挂在.NET Core 3.0依赖项上。但目前尚不清楚为什么这只会在部署期间引起问题。Azure App Service还没有为.NET Core 3.1做好准备吗?或者这是依赖解决目标的问题?

0 投票
1 回答
168 浏览

asp.net-core - 在 ASP.NET Core 项目中将调试构建配置删除为默认配置

在 ASP.NET Core 3.1 应用程序 CSProj 文件中,我有以下内容:

所以我设置了一个“开发”构建配置,它基本上是调试配置。

当我简单地使用dotnet build该项目时,是使用 Debug 配置构建的。

要使用开发配置,我需要使用dotnet build -c development.

是否可以将development配置设置为默认配置,以便由以下人员使用:

点网构建

0 投票
1 回答
3009 浏览

c# - 运行 Windows 服务时访问被拒绝

我使用 ASP.Net Core 3.x 和 C# 创建了一个 Windows 服务。我在构建项目时使用了新的 Windows 服务模板。当我从我的开发环境或控制台窗口运行它时,它运行良好。当我将它安装为 Windows 服务并尝试启动该服务时,我收到“错误 5:访问被拒绝”。错误。

我尝试了很多东西,我将在下面概述以消除错误,但似乎没有任何效果,所以我下载了 Microsoft 提供的示例应用程序,示例

同样的结果...当我从 Visual Studio 中运行示例应用程序时,它运行良好,当作为服务运行时,我收到拒绝访问错误。

  • 我在我的本地机器上运行所有这些,我是管理员。

  • 我最初尝试使用默认的本地系统帐户运行它;收到拒绝访问错误。我将登录身份更改为我的域帐户,这与我用来登录本地计算机的相同,该本地计算机是这台计算机上的管理员;得到相同的访问被拒绝错误。

  • 我的帐户具有作为服务运行的权限。

  • 事件查看器只显示一条消息“拒绝访问”,没有其他消息被创建。

  • 我相信访问被拒绝错误甚至在 C# 代码执行之前就发生了。让我相信这是我在 Program.Main.... 的最顶部添加了一行File.WriteAllText("C:\\temp\\ws.log", $"Test of Worker Service @ {DateTime.Now}. Content Root Path: {AppContext.BaseDirectory}");。我的帐户对临时文件夹具有完全访问权限。当我从 Visual Studio 运行应用程序时会创建此文件,但当我将应用程序作为服务运行时不会创建它。

  • 我已经阅读了许多网站,包括这个这个。不走运,我从这些站点尝试的所有内容仍然会产生拒绝访问错误。

我的想法已经用完了,希望这里有人可以为我提供答案。谢谢!

0 投票
1 回答
495 浏览

asp.net-core - Asp.Net Core 3.1 MVC Web 应用程序使用 SqlDateTime 编译错误

关于 SqlDateTime 的使用,我无法将我的 Web 应用程序从 2.2 迁移到 3.1。为了确保我的迁移没有问题,我使用 Visual Studio 2019 16.4 中的标准 asp.net core 3.1 模板创建了一个新的 MVC Web 应用程序。当我添加一个变量并将其分配给 SqlDateTime 时,我得到一个编译错误......

“SqlDateTime”类型存在于“System.Data.Common, Version=4.2.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”和“System.Data.SqlClient, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”中'

以前它在使用 System.Data.SqlClient 时可以工作,但我知道这已在 3.0 中被 Microsoft.Data.SqlClient 取代,但后者没有 SqlDateTime,因此获得它的唯一方法是使用 System.Data。 SqlTypes 但这会产生编译错误。我什至没有包括 System.Data.SqlClient 所以我有点困惑为什么编译器会引用它。有任何想法吗?

在此处输入图像描述

0 投票
1 回答
376 浏览

authentication - 如何验证使用 Google 登录的用户是否仍然有效?

我正在运行 .NET Core v3.1 和 Blazor 并已使用 Google 实现了授权,仅限于我们在 Google G Suite 中的域,如下所述:https ://www.jerriepelser.com/blog/forcing-users-sign-in- gsuite-域帐户/

登录/注销工作正常,但是当登录的用户在 Google G Suite 中被阻止或删除时,用户会一直登录到我的应用程序,直到他从应用程序中注销。当他不注销时,他可以继续使用该应用程序。

我正在寻找每小时刷新一次。

这是我的 login.cshtml.cs:

我已经添加了IssuedUtcExpiresUtc但这并没有改变任何东西。

0 投票
1 回答
1459 浏览

c# - 如何将 Kestrel 配置为使用随机动态端口并在运行时使用 ASP.NET Core 3.1 确定端口?

使用 ASP.NET Core 3.0 我已经能够使用这种IHostedService方法......

确定 Kestrel 绑定到的端口

... 在运行时确定 Kestrel 的动态端口。

IServerAddressesFeature此处记录了 ASP.NET 3.0:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.server.features.iserveraddressesfeature?view=aspnetcore-3.0

但是,当将版本更改为 ASP.NET Core 3.1 时,页面会重定向回 ASP.NET 3.0,并提示该文档不适用于 ASP.NET Core 3.1。IServerAddressesFeature不再工作了吗?与 ASP.NET Core 3.1 一起使用IServerAddressesFeature仍然可以编译,但返回的端口ServerAddresses始终为零。

程序:

后来,什么时候Configure叫...

...服务器地址分配给HostedService.ServerAddresses静态变量,如链接示例中所示。但是,ServerAddresses仅包含端口为零的环回地址:"http://127.0.0.1:0"

我忽略了什么吗?是否有不同的、正确的方法来解决 v3.1 中的问题?如何使用 ASP.NET Core 3.1 配置 Kestrel 以使用随机动态端口并确定它在运行时(在任何控制器操作发生之前)是哪个端口?

更新

这是一个丑陋的解决方法,有助于确定端口。动态端口分配的时间或顺序似乎发生了变化。从该HostedService.StartAsync方法返回并稍后读取服务器地址似乎就足够了。肯定有更好的方法吗?