小编Lor*_*eno的帖子

如何在 .NET Core 控制台应用程序中使用 Serilog

我希望我的应用程序能够记录到文件,所以我开始寻找比默认的 .NET Core 2.2 日志框架更多的东西。我看到 Serilog 可能会完成这项工作。但是,我找不到任何关于如何使用依赖注入在 .NET Core 控制台应用程序中设置 Serilog 的文档。我看到的只是 ASP.NET 材料,这可能不是我需要的。

我开始自己做。我安装了(Nuget):

  • 串行日志
  • Serilog.Extensions.Logging
  • Serilog.Sinks.File
  • Serilog.Sinks.Console(将 Serilog 用于我的所有日​​志记录)

我创建了一个扩展ServiceCollection

        public static void AddLogging(this IServiceCollection services, Microsoft.Extensions.Logging.LogLevel logLevel)
        {
            var serilogLogger = new LoggerConfiguration()
            .WriteTo.Console()
            .WriteTo.File("log.txt")
            .CreateLogger();

            services.AddLogging(builder =>
            {
                builder.SetMinimumLevel(logLevel);
                builder.AddSerilog(logger: serilogLogger, dispose: true);
            });
        }
Run Code Online (Sandbox Code Playgroud)

但是,日志记录有效:

  • 日志级别不是我设置的。虽然我想要调试,但似乎 serilog 正在使用 INFO 级别。为什么我的设置不被尊重?毕竟我还在使用 NET Core 的日志框架,所以我用它来设置日志级别
  • 我真的正确地进行了这个设置吗?我不确定是否dispose应该true。通常,我希望 NET Core 的依赖注入框架来处理服务的处理。

c# logging serilog .net-core

21
推荐指数
1
解决办法
2万
查看次数

B2C 返回的 Token 没有被 JWT.MS 解码

我正在关注https://docs.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows 上的教程。我创建了注册/登录用户流程,我只是尝试使用它。我选择了 Google 提供商,因为我已经定义了它。我输入我的国家和显示名称,因为我选择了这些参数是必需的。然后我被重定向到我的应用程序的重定向 URI,即https://jwt.ms。重定向是:

https://jwt.ms/?code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMCIsInppcCI6IkRlZmxhdGUiLCJzZXIiOiIxLjAifQ..Q45eRY9bXPGXqmqn.WFmA7ERvYw2gsZgAy8zjdBNsxp-fX828V0DMhwLfIw3XTk1cYiIXOaBT0uUkT8HA9mZfJJDBYodM_Ca3xt17lCqGoUHyS8pOtfZQ8pqfOTxdCL6-llVAQYKV9vHKPxWDXYhLxS9sDNTmVUGfALgxPeiZj8nZs9i7ZzFzYXtNyAIATrMSX-r4lGGMWxFgsNp-Vhk7PXZ2_8bgzXiFGLgPXCwVROD_WR7EEMSGTgN_ECbtsRz-ATriYS5s5tfzHhv1cT2f4ELB-OY84bl1nk5LOjSPBoDqXIX-K-pLb6lvXJ4WDFwjzNE7RDcNHlfnNeOivXoPPb4CmAdQvy3SpRJG6i00PgnuDryPOlUEubNoTloB4VPYM_l1n9ueilHugJbKG7B7HxTz5SFDI450dbrv0PSxG47tyC4o3RJ8KMxa4jT5mDEcI7szWQGpVJp_YMDq5yk47ZnDuZ5PnQYoxvzTPHEKVdi6CVsCslBdnxZk61Ep2pKbwa7zvFujS0E14srCOPCnVsE0NwUXx74c1a7H-mRqLCuH0Q0byplcEY1r8xS-ftvRDs1ahRCjxVIBrob9dJSy3bpRsi8wef1KB3wuhWJQMw.WNAXijIJxquWcAqzHeOJXA

问题是,JWT.MS 没有解码它,我只是看到:

在此处输入图片说明

我尝试将我的令牌粘贴到框中,但没有任何反应。我也尝试使用具有相同令牌的 JWT.IO。我得到的信息:

无效签名

为什么 B2C 会向我返回无效的令牌?

oauth-2.0 jwt azure-ad-b2c

9
推荐指数
1
解决办法
1067
查看次数

如何将一个HttpClient注入到多个服务中

我正在构建一个 API 客户端。我的 API 相当大,所以我决定将其分成大约 5 个(私有)子客户端,每个子客户端涵盖 API 的不同部分。5 个客户端使用起来不太舒服,所以我希望将它们置于 1 (public) 之下ApiClient,这将充当这 5 个客户端之上的一种外观。问题是我可能应该HttpClient在所有这些子客户端之间共享一个。据我所知,我可以做这样的事情:

services.AddHttpClient<SubClient1>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
Run Code Online (Sandbox Code Playgroud)

通过上面的行,我的SubClient1将被注入到我的公共中ApiClient,并且HttpClient已经使用BaseAddress. 现在,我如何注册所有 5 个子客户端(SubClient1SubClient2SubClient3、 ...)以便他们每个人都收到相同的信息HttpClient?我认为下面的代码将创建 5 个HttpClient实例:

services.AddHttpClient<SubClient1>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient2>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient3>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient4>(c => c.BaseAddress = new System.Uri("https://myapi.com"));
services.AddHttpClient<SubClient5>(c => c.BaseAddress = new System.Uri("https://myapi.com")); …
Run Code Online (Sandbox Code Playgroud)

.net c# dependency-injection .net-core

8
推荐指数
2
解决办法
9644
查看次数

docker容器如何上网

我安装了 docker(Docker for Mac)。我启动一个新容器

docker run -it ubuntu
Run Code Online (Sandbox Code Playgroud)

我可以看到我新创建的容器只需调用即可访问互联网

ping google.com
Run Code Online (Sandbox Code Playgroud)

我懂了:

root@b06e1a46cc40:/# ping google.com
PING google.com (216.58.209.14) 56(84) bytes of data.
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=1 ttl=37 time=63.0 ms
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=2 ttl=37 time=63.7 ms
64 bytes from sof01s12-in-f14.1e100.net (216.58.209.14): icmp_seq=3 ttl=37 time=64.8 ms
Run Code Online (Sandbox Code Playgroud)

接下来,我检查了容器连接到的网络:

root@b06e1a46cc40:/# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever …
Run Code Online (Sandbox Code Playgroud)

networking docker

7
推荐指数
1
解决办法
8954
查看次数

IHostedService - StopAsync 与 Dispose

我正在构建一个IHostedService实现。我的服务做了一些事情,这些事情应该在服务终止时处理,例如将一些事件处理程序注册到StartAsync().

现在我想知道,我应该在哪里真正注销这些处理程序?我自然会这样做Dispose()。然而,StopAsync()那是为了什么?

在控制台应用程序环境中,我认为它会像这样工作:

  1. StopAsync()叫做
  2. Dispose()叫做

我希望我的应用程序设计良好并涵盖其他可能的场景。例如,后台服务。我认为在这种情况下,有一个选择StopAsync(),然后StartAsync()没有Dispose()之间的选择。我对吗?

我应该处理这种情况吗?我的意思是,去登记StartAsync()我是否已经以某种方式注册了?

很难在带有控制台应用程序的 .NET Core 中找到有关通用主机的一些最佳实践。

.net c# console-application .net-core

7
推荐指数
1
解决办法
4197
查看次数

当使用“apt update”运行时,Docker 构建会在 software-properties-common 上停止

我有 2 个 dockerfile:

FROM ubuntu:20.04
RUN apt-get update && apt-get install -y \
    software-properties-common \
    python3
Run Code Online (Sandbox Code Playgroud)
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y software-properties-common
RUN apt-get update && apt-get install -y \
    python3
Run Code Online (Sandbox Code Playgroud)

问题是:当我运行第一个(使用docker build)时,构建过程会挂起:

在此输入图像描述

software-properties-common包询问我有关地理区域的信息 - 我无法提供任何输入,我想在构建图像时不允许这样做。

但是,当我构建第二个dockerfile时,不会出现此问题。我很好奇——这是为什么?

docker dockerfile

6
推荐指数
1
解决办法
6150
查看次数

Windows 机器文件复制 - DevOps 任务和 IP 地址

我正在 Azure DevOps 上构建发布管道。我发布的一部分内容是将一堆文件复制到 Azure VM。据我了解,目标机器需要打开 PowerShell 5986 端口。

我有一个打开端口 5986 的虚拟机(我通过使用“目标机器上的 PowerShell”任务远程调用此虚拟机上的一些命令来验证这一点)。我添加了“Windows 机器文件复制”任务并填写了字段: - 源 - 机器 - 管理员登录 - 密码 - 目标文件夹

在“机器”字段中,我输入了目标机器的 IP。

由于运行该版本,我收到一个错误:

无法创建目标为“\\11.11.11.11\C$\TargetDirectory”的 PSDrive,错误消息:“找不到网络路径”找不到网络路径

我还尝试将 IP 地址与端口放在一起,格式如下:11.11.11.11:5986

然后,我收到了这个错误:

无法将值“\23.97.151.221:5986”转换为类型“System.Uri”。错误:“无效的 URI:无法解析主机名。”

文档 ( https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/deploy/windows-machine-file-copy?view=azure-devops ) 说允许带有端口的 IP 地址。

这里有什么问题?

powershell azure azure-devops azure-pipelines azure-pipelines-release-pipeline

5
推荐指数
2
解决办法
5870
查看次数

.NET 5 如何构建 netcoreapp3.1?

我正在构建一个 Azure Function 项目,所以我不能以 .NET 5 为目标。相反,我的项目是一个netcoreapp3.1. 但是,当我的项目构建时,只要打印了一些信息,我就会看到提到了 dotnet 5。例子:

##[警告]/usr/share/dotnet/sdk/5.0.101/Microsoft.Common.CurrentVersion.targets(2123,5):警告 MSB3245:无法解析此引用。无法找到程序集“System.Text.Json,Version=4.0.1.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”。检查以确保程序集存在于磁盘上。如果您的代码需要此引用,您可能会收到编译错误。

(我在 System.Text.Json 中遇到的问题本身就是一个问题,在这篇文章中,我想了解 .NET 5 如何构建 netcoreapp3.1)。

我的系统上安装了 .NET Core 3.1,紧挨着 .NET 5。为什么构建系统不使用 3.1?我相信 .NET 5 与 3.1 相比有一些重大变化,所以我不确定使用 .NET 5 来构建项目是否可以。

同样的事情发生在 Azure DevOps Pipeline 构建和本地。在本地,在 Rider 中,我在构建时也看到了这一点:

控制台:使用构建工具:/usr/share/dotnet/sdk/5.0.102/MSBuild.dll

这是结果ll /usr/share/dotnet/sdk

drwxr-xr-x 28 root root  12K sty 13 08:24 3.1.405/
drwxr-xr-x 28 root root  12K sty 13 08:24 5.0.102/
Run Code Online (Sandbox Code Playgroud)

如您所见,我有 3.1 和 5。

.net c#

5
推荐指数
1
解决办法
1355
查看次数

kubectl 日志部署/我的部署不显示来自所有 pod 的日志

https://kubernetes.io/docs/reference/kubectl/cheatsheet/#interacting-with-deployments-and-serviceskubectl logs deploy/my-deployment中显示的目的是什么?

我认为它会向我显示作为对象一部分部署的所有 Pod 的日志my-deployment。然而,即使我的部署中有 2 个 Pod,该命令也仅显示其中一个的日志。

kubernetes kubectl

5
推荐指数
1
解决办法
4644
查看次数

@opentelemetry/sdk-node 与 @opentelemetry/sdk-tracing-node

我正在尝试在 Node 应用程序中使用开放遥测。我发现有些示例要求我安装@opentelemetry/sdk-node(例如这个官方指南),而另一些示例则要求我安装@opentelemetry/sdk-tracing-node(例如这个,也是官方指南),这有点令人困惑。

需要的示例@opentelemetry/sdk-node具有如下代码:

const sdk = new opentelemetry.NodeSDK({
  traceExporter: new opentelemetry.tracing.ConsoleSpanExporter(),
  instrumentations: [
    // instrumentations...
  ]
});

sdk.start()
Run Code Online (Sandbox Code Playgroud)

使用的@opentelemetry/sdk-tracing-node都是这样的:

registerInstrumentations({
  instrumentations: [
    // instrumentations...
  ]
});

const provider = new NodeTracerProvider();
const exporter = new ConsoleSpanExporter();
const processor = new BatchSpanProcessor(exporter);
provider.addSpanProcessor(processor);

provider.register();
Run Code Online (Sandbox Code Playgroud)

他们有些相似,我猜他们最终会达到同样的目的。问题是:

  • 这两种方法有什么区别?
  • 其中之一更好,也许现在更推荐?

javascript node.js open-telemetry

5
推荐指数
1
解决办法
567
查看次数