小编Jer*_*ney的帖子

将 DTO 类与 ORM 一起使用时,C#8 中的可空引用类型

我在具有数据传输对象 (DTO) 类的项目中激活了此功能,如下所示:

public class Connection
    {
        public string ServiceUrl { get; set; }
        public string? UserName { get; set; }
        public string? Password { get; set; }
        //... others 
    }
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

CS8618:不可为空的属性“ServiceUrl”未初始化。考虑将该属性声明为可为空的。

这是一个 DTO 类,所以我没有初始化属性。这将是初始化类的代码的责任,以确保属性不为空。

例如,调用者可以这样做:

var connection = new Connection
{
  ServiceUrl=some_value,
  //...
}
Run Code Online (Sandbox Code Playgroud)

我的问题:当启用 C#8 的可空性上下文时,如何处理 DTO 类中的此类错误?

c# orm dto c#-8.0 nullable-reference-types

25
推荐指数
5
解决办法
9840
查看次数

Visual Studio 2019 进程未关闭,NodeJS 问题

我正在全新安装 Windows 10 专业版 (10.0.18362) 并尝试安装 Visual Studio 2019 并针对 .NET Core 3.1 Web 开发进行配置,但遇到了几个问题。

我创建了一个默认的 React.js ASP.NET Core Web 应用程序并运行了该项目。一切似乎都正常,只是在更新 JavaScript 代码后,浏览器会在一段相当长的停顿后更新;事情似乎滞后了。

从默认 Web 应用程序(无更新)关闭 Visual Studio 2019 后,有几个进程似乎挂起,必须手动关闭:

Visual Studio 2019 进程

除了手动安装 Node.js V12.4 和 V13.6 之外,我还尝试使用 Visual Studio 安装程序提供的 Node.js 安装 Visual Studio 2019,结果相同。

另一个问题:如果我使用 将项目从 JavaScript 更新为 TypeScript npx create-react-app client-app --typescript,热更新将完全停止工作。但是在更新 JavaScript 代码并刷新浏览器之后,事情似乎有所更新,因此它似乎确实在重新编译。我试过在 Firefox 和 Chrome 中调试,结果都一样。

我很犹豫要不要继续使用这个安装,因为我在这些过程中遇到了几个问题。如果这些意外挂起并且没有关闭,它们将继续使用旧版本的代码,并且在关闭进程之前所做的任何事情都不会更新,从而导致完全的疯狂。

是否有我需要执行的特定安装过程作为解决方法?或者我可能缺少 NuGet 包或附加组件?由于这是操作系统的全新安装,是否需要安装 Windows 功能?或其他可能导致此问题的配置/权限更改?

在此安装之前,只有在 Visual Studio 2017 中创建的项目似乎按预期工作。但是我需要在 .NET Core 3.0 中开发这个站点,而且看起来只支持 Visual Studio 2019。

更新

经过一番折腾,看起来问题是由 …

node.js typescript reactjs visual-studio-2019 asp.net-core-3.0

25
推荐指数
2
解决办法
3270
查看次数

未从 FirstOrDefault 公开的可空引用类型信息

我想在 C# 8.0 中测试新的可为空引用类型功能。

我启动了一个针对 .NET Core 3.0 的新项目,在.csproj文件中启用了可为空的引用类型,并开始编码。我创建了一个简单的列表,它接受 astring[]并返回该string数组中等于 的abc。现在,因为我不确定abc数组中是否真的存在,所以我使用FirstOrDefault()null如果没有找到匹配项,它应该默认为。

using System;
using System.Linq;

public string FindArgument(string[] args)
{
    var arg = args.FirstOrDefault(x => x == "abc");
    return arg;
}
Run Code Online (Sandbox Code Playgroud)

我的方法的返回值string,这应该现在是非空的类型。由于FirstOrDefault()可能返回null,我希望上述方法在返回可能为空 arg变量时产生警告。它不是。

查看FirstOrDefault()Visual Studio 中的签名,很明显原因:该方法返回一个string,而不是string?我期望的可空等价物。

使用下面的方法体确实会产生我预期的警告:

var arg = args.Contains("abc") ? "abc" : …
Run Code Online (Sandbox Code Playgroud)

c# linq c#-8.0 nullable-reference-types .net-core-3.0

20
推荐指数
1
解决办法
1483
查看次数

当空引用似乎不可能时,为什么我们会收到可能取消引用空引用警告?

在HNQ 上阅读了这个问题后,我继续阅读C# 8 中的可空引用类型,并做了一些实验。

我非常清楚,当有人说“我发现了一个编译器错误!”时,10 次中有 9 次,甚至更频繁。这其实是有意为之,也是自己的误会。而且因为我今天才开始研究这个功能,显然我对它不是很了解。有了这个,让我们看看这段代码:

#nullable enable
class Program
{
    static void Main()
    {
        var s = "";
        var b = s == null; // If you comment this line out, the warning on the line below disappears
        var i = s.Length; // warning CS8602: Dereference of a possibly null reference
    }
}
Run Code Online (Sandbox Code Playgroud)

在阅读我上面链接的文档后,我希望该s == null行给我一个警告——毕竟s显然是不可为空的,所以将它与它进行比较null是没有意义的。

相反,我在下一行收到警告,警告说这s可能是一个空引用,即使对于人类来说,很明显它不是。

此外,如果我们不与 进行比较,则不会显示警告。 …

c# roslyn c#-8.0 nullable-reference-types

19
推荐指数
2
解决办法
7954
查看次数

将 ASP.NET Core 5 应用部署到现有的 Azure 应用服务?

我有一个在 ASP.NET Core 3.x 上运行的现有 Azure 应用服务。我已将应用程序升级到今天发布的ASP.NET Core 5。这在我的本地 IIS Express 服务器上运行良好。但是,当我使用 Visual Studio 2019 将应用程序发布到应用服务时,收到以下错误:

HTTP 错误 500.31 - ANCM 无法找到本机依赖项

此问题的常见解决方案:

未找到指定版本的 Microsoft.NetCore.App 或 Microsoft.AspNetCore.App。

随着启用了详细的错误,我得到了以下信息:

It was not possible to find any compatible framework version 
The framework 'Microsoft.AspNetCore.App', version '5.0.0' was not found.

The following frameworks were found: 
2.1.20 at [D:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App] 
2.1.22 at [D:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App] 
2.2.11 at [D:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App] 
2.2.14 at [D:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App] 
3.0.3 at [D:\Program Files (x86)\dotnet\shared\Microsoft.AspNetCore.App] …
Run Code Online (Sandbox Code Playgroud)

azure azure-web-app-service asp.net-core .net-5 asp.net-core-5.0

18
推荐指数
1
解决办法
6952
查看次数

使用 System.Text.Json 修改 JSON 文件

我知道您可以使用 Newtonsoft 轻松完成此操作。然而,当我使用 .NET Core 3.0 时,我正在尝试使用新方法与 JSON 文件交互System.Text.Json——即——我拒绝相信我正在尝试做的事情有那么困难!

我的应用程序需要列出尚未添加到我的数据库中的用户。为了获取所有用户的完整列表,该应用程序从 Web API 检索 JSON 字符串。我现在需要遍历这些用户中的每一个,并在将新的 JSON 列表返回到我的视图之前检查他们是否已经添加到我的应用程序中,以便它可以向最终用户显示新的潜在用户。

由于我最终会在流程结束时返回另一个 JSON,因此我不想特别费心将其反序列化为模型。请注意,来自 API 的数据结构可能会改变,但它总会有一个键,我可以从中与我的数据库记录进行比较。

我的代码目前看起来像这样:

using (WebClient wc = new WebClient())
{
    var rawJsonDownload = wc.DownloadString("WEB API CALL");
    var users =  JsonSerializer.Deserialize<List<UserObject>>(rawJsonDownload);

    foreach (var user in users.ToList())
    {
        //Check if User is new
        if (CHECKS)
        {
            users.Remove(user);
        }
    }

    return Json(users); 
}
Run Code Online (Sandbox Code Playgroud)

为了实现对 Newtonsoft 来说相当微不足道的东西,这似乎有很多障碍需要跳过。

任何人都可以建议我这样做的更好方法 - 理想情况下,不需要UserObject?

c# json asp.net-core asp.net-core-3.0 system.text.json

15
推荐指数
1
解决办法
7534
查看次数

dotnet 发布 CLI 排除 .pdb

在 .NET 7 中,我这样做:

dotnet publish --self-contained --configuration Release --runtime win7-x64 --output myapp
Run Code Online (Sandbox Code Playgroud)

如何防止.pdb结果中出现文件?理想情况下,只使用 CLI?

我可以采取任何其他步骤来减小结果大小吗?

.net c# asp.net-core .net-7.0 asp.net-core-7.0

13
推荐指数
2
解决办法
7851
查看次数

向 .NET Core 3 应用程序添加身份服务器身份验证失败,并显示“未指定密钥类型”。

我正在尝试向 .NET Core 3 API 项目添加身份服务器身份验证。

我已经添加了这个代码

public void ConfigureServices(IServiceCollection services)
{
    … 

    var identityBuilder = services.AddIdentityServer();

    identityBuilder.AddApiAuthorization<ApplicationUser, DbContext>();

    services
        .AddAuthentication()
        .AddIdentityServerJwt();

    var fileName = Path.Combine("Certificates", "certificatefile.pfx");
    var cert = new X509Certificate2(fileName, "veryDifficultPassword");
    identityBuilder.AddSigningCredential(cert);

    … 
}
Run Code Online (Sandbox Code Playgroud)

和:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    … 
    app.UseAuthentication();
    app.UseIdentityServer(); // <--- this line throws error.
    app.UseAuthorization();
    … 
}

Run Code Online (Sandbox Code Playgroud)

文件/Certificates夹中有一个文件可以正确读取和加载- 我可以检查cert变量并且它看起来是正确的。

到目前为止,我所尝试的一切都以线路app.UseIdentityServer();炸毁而告终:

System.InvalidOperationException: '未指定密钥类型。'

有什么建议?

更新:包括堆栈跟踪

System.InvalidOperationException
  HResult=0x80131509
  Message=Key type not specified.
  Source=Microsoft.AspNetCore.ApiAuthorization.IdentityServer
  StackTrace:
   at Microsoft.AspNetCore.ApiAuthorization.IdentityServer.ConfigureSigningCredentials.LoadKey()
   at …
Run Code Online (Sandbox Code Playgroud)

.net-core asp.net-core identityserver4 asp.net-core-identity asp.net-core-3.0

12
推荐指数
1
解决办法
6603
查看次数

从 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 应用服务时,我收到以下错误:

资产文件“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的应用程序Service的还没有准备好.NET 3.1的核心?或者这是依赖解析目标的问题?

visual-studio webdeploy azure-web-app-service asp.net-core asp.net-core-3.1

12
推荐指数
1
解决办法
4881
查看次数

如何定义到多个区域的端点路由

我正在尝试定义一个MapAreaControllerRoute()到多个区域的路由。但是,在 ASP.NET Core 3.0 中,有areaName:一个需要设置的参数,因此将每个路由限制在一个区域内。我不明白如何使用一条适用于多个区域的路线。

我已经阅读了有关 Stack Overflow 的许多问题,但似乎这是 ASP.NET Core 3.0 中的一个新要求。在 ASP.NET Core <= 2.2 中,您可以在MapRoute()不定义 set的情况下创建 a areaName

就像现在一样,在 my 中Startup.cs,我将端点定义为:

app.UseEndpoints(endpoints =>
{
  endpoints.MapAreaControllerRoute(
    name: "Area1",
    areaName: "Area1",
    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
  );

  endpoints.MapAreaControllerRoute(
    name: "Area2",
    areaName: "Area2",
    pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
  );

  endpoints.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

});
Run Code Online (Sandbox Code Playgroud)

当然,必须有一种方法来定义一条路线来覆盖所有区域?

c# asp.net-mvc asp.net-core-routing asp.net-core-3.0

10
推荐指数
2
解决办法
8163
查看次数