我收到来自 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) 我正在尝试创建一个文件 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) 我正在尝试将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) 所以基本上我有一个脚本,根据这个节点是否存在更新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)
所以我的问题是 - 有没有办法阻止这个名称空间添加到正在插入的节点?
我有一个例子,当我得到一个非常大的文本数据并且每行包含一些元数据+ 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)