小编Mik*_*ike的帖子

如何使用 System.Text.Json API 将流反序列化为对象

我收到来自 web api 调用的响应作为流,需要将其反序列化为模型。

这是一个通用方法,所以我不能说代码的哪些部分将使用它以及响应负载是什么。

这是方法:

public async Task<T> InvokeAsync<T>(string method)
{
    Stream response = await this.httpClientWrapper.InvokeAsync(method);
    var serializer = new JsonSerializer();
    using var streamReader = new StreamReader(response);
    using var reader = new JsonTextReader(streamReader);
    return serializer.Deserialize<T>(reader);
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试删除 Newtonsoft 并使用System.Text.Json API。

我在 Github 的 corefx repo 中找到了这个移植指南,其中部分Read from a Stream/String指出:

我们目前(从 .NET Core 3.0 预览版 2 开始)没有方便的 API 来直接(同步或异步)从流中读取 JSON。对于同步读取(尤其是小型有效负载),您可以将 JSON 有效负载读取到流结束为止,并将其转换为字节数组并将其传递给读取器

所以按照这个建议,我想出了以下几点:

public async Task<T> InvokeAsync<T>(string method)
{
    Stream response = await this.httpClientWrapper.InvokeAsync(method);
    var …
Run Code Online (Sandbox Code Playgroud)

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

11
推荐指数
1
解决办法
9487
查看次数

单文件 ASP.NET Core 5 Web 应用程序不加载静态资源

我正在尝试创建一个文件 asp.net core 5 Web 应用程序。目标是拥有一个 .exe 文件,通过执行此 exe 文件来运行 Kestrel 服务器并在浏览器中加载页面。

我在 VS 2019 中创建了一个 ASP.NET Core 5 模板应用程序。然后使用 cli 运行以下命令:

dotnet publish -c Release -r win-x64 /p:PublishSingleFile=true \n 
/p:IncludeNativeLibrariesForSelfExtract=true --self-contained true
Run Code Online (Sandbox Code Playgroud)

这会生成一个 exe 文件,当我将其复制到其他地方时,运行不会出现问题。但是当我浏览页面时,没有加载任何静态文件:

在此输入图像描述

生成单个文件 asp.net core 应用程序以便加载静态内容的正确方法是什么?

编辑

根据要求,将发布后输出的屏幕截图放在这里

在此输入图像描述

编辑2

要获得可重现的项目:

Visual Studio 2019 -> 新解决方案 -> ASP.NET Core Web App,配置如下

在此输入图像描述

编辑3

感谢@JHBonarius 的回答,我更改了 Program.cs 以设置为提取内容的ContentRoot临时文件夹。wwwroot

public class Program
    {
        public static void Main(string[] args)
        {
            var path = Path.Combine(Path.GetTempPath(), ".net", typeof(Program).Assembly.GetName().Name);

            var directory …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core .net-5

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

这是传递给带有in关键字的方法的只读结构的防御性副本

我正在尝试将a传递readonly struct给带有in修饰符的方法。当我查看生成的IL代码时,似乎已经构造了只读结构的防御性副本。

readonly struct被定义为

public readonly struct ReadonlyPoint3D
{
    public ReadonlyPoint3D(double x, double y, double z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }

    public double X { get; }
    public double Y { get; }
    public double Z { get; }
}
Run Code Online (Sandbox Code Playgroud)

接受的方法 ReadonlyPoint3D

private static double CalculateDistance(in ReadonlyPoint3D point1, in ReadonlyPoint3D point2)
{
    double xDifference = point1.X - point2.X;
    double yDifference = point1.Y - point2.Y;
    double zDifference = point1.Z …
Run Code Online (Sandbox Code Playgroud)

c# cil .net-core

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

如何防止XML-DML修改函数向插入节点添加空名称空间

所以基本上我有一个脚本,根据这个节点是否存在更新XML.这是t-sql

DECLARE @newJob XML
SET @newJob = N'<job>
    <job-detail>
      <name>job-name</name>
    </job-detail>
  </job>'

;WITH XMLNAMESPACES(DEFAULT 'http://quartznet.sourceforge.net/JobSchedulingData')
UPDATE XmlTable
SET ConfigXml.modify('
insert sql:variable("@newJob") 
as last into (/quartz)[1]')
WHERE ConfigXml.exist(N'//quartz/job/job-detail/name[.="job-name"]') = 0
Run Code Online (Sandbox Code Playgroud)

现在一切都按预期工作,只是插入的节点现在包含这样的空命名空间

<job xmlns="">
Run Code Online (Sandbox Code Playgroud)

如果我删除

;WITH XMLNAMESPACES(DEFAULT 'http://quartznet.sourceforge.net/JobSchedulingData')
Run Code Online (Sandbox Code Playgroud)

查询停止执行.我认为这是因为我的根节点定义了名称空间

<quartz xmlns="http://quartznet.sourceforge.net/JobSchedulingData" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" overwrite-existing-jobs="true">
Run Code Online (Sandbox Code Playgroud)

所以我的问题是 - 有没有办法阻止这个名称空间添加到正在插入的节点?

t-sql xml-dml sql-server-2008

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

如何使用 System.Text.Json 将 ReadOnlySpan&lt;char&gt; 反序列化为对象

我有一个例子,当我得到一个非常大的文本数据并且每行包含一些元数据+ json 数据字符串。我需要处理每一行的json数据。

这就是我所拥有的:

public Data GetData(string textLine)
{
    var spanOfLine = textLine.AsSpan();
    var indexOfComma = spanOfLine.IndexOf(":");
    var dataJsonStringAsSpan = spanOfLine.Slice(indexOfComma + 1);

    // now use dataJsonStringAsSpan which is ReadOnlySpan<char> to deserialize the Data
}
Run Code Online (Sandbox Code Playgroud)

其中 Data 是一个 Dto 类,它具有一堆 (7) 不同的属性:

public class Data
{
    public int Attribute1 { get; set; }

    public double Attribute2 { get; set; }
    // ... more properties, emitted for the sake of brevity
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过System.Text.JsonAPI 来实现这一点。令人惊讶的是,它没有任何可以反序列化的重载ReadOnlySpan<char>,所以我想出了这个:

public Data GetData(string …
Run Code Online (Sandbox Code Playgroud)

c# json json-deserialization .net-core system.text.json

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