Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从asp.net core流式传输大数据集时性能不佳_C#_Wpf_Asp.net Core_Streaming - Fatal编程技术网

C# 从asp.net core流式传输大数据集时性能不佳

C# 从asp.net core流式传输大数据集时性能不佳,c#,wpf,asp.net-core,streaming,C#,Wpf,Asp.net Core,Streaming,我有一个直接与数据库通信的WPF应用程序(托管在Azure VM中的SQL Server),我需要替换该直接通信,以便所有数据库调用都通过一个Web服务进行。因此,我创建了一个简单的ASP.NET Core 5 api,其中包含一个控制器,该控制器执行查询,然后将数据流回到客户端。控制器基本上如下所示: [HttpGet] [Route("api/StreamDataSet")] public IEnumerable<object[]> StreamDataSet

我有一个直接与数据库通信的WPF应用程序(托管在Azure VM中的SQL Server),我需要替换该直接通信,以便所有数据库调用都通过一个Web服务进行。因此,我创建了一个简单的ASP.NET Core 5 api,其中包含一个控制器,该控制器执行查询,然后将数据流回到客户端。控制器基本上如下所示:

[HttpGet]
[Route("api/StreamDataSet")]
public IEnumerable<object[]> StreamDataSet()
{
    //get request details from header
    var procedureName = Request.Headers["Procedure"];
    var serverName = Request.Headers["ServerName"];

    using (SqlConnection connection = _dataService.GetConnection(serverName))
    {
        connection.Open();
        using (SqlCommand command = _dataService.GetCmd(procedureName, connection))
        {
            using (SqlDataReader reader = command.ExecuteReader(CommandBehavior.SequentialAccess))
            {
                while (reader.Read())
                {
                    var values = new Object[reader.FieldCount];
                    reader.GetValues(values);
                    yield return values;
                }                    
            }
        }
    }
}
[HttpGet]
[路由(“api/StreamDataSet”)]
公共IEnumerable StreamDataSet()
{
//从标头获取请求详细信息
var procedureName=Request.Headers[“Procedure”];
var serverName=Request.Headers[“serverName”];
使用(SqlConnection-connection=\u dataService.GetConnection(serverName))
{
connection.Open();
使用(SqlCommand=\u dataService.GetCmd(procedureName,connection))
{
使用(SqlDataReader=command.ExecuteReader(CommandBehavior.SequentialAccess))
{
while(reader.Read())
{
var值=新对象[reader.FieldCount];
reader.GetValues(值);
收益回报值;
}                    
}
}
}
}
然后在客户机中使用它,我甚至没有对数据做任何事情(目前),只是将其作为流接收

using (HttpResponseMessage response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
    using (Stream stream = await response.Content.ReadAsStreamAsync())
    {
        System.Text.Json.JsonSerializerOptions options = new System.Text.Json.JsonSerializerOptions();
                    
        var result = await System.Text.Json.JsonSerializer.DeserializeAsync<object[]>(stream, options);
        //do something here with the received data
    }
}
使用(httpresponsemessageresponse=wait client.sendaync(请求,HttpCompletionOption.ResponseHeadersRead))
{
使用(Stream=await response.Content.ReadAsStreamAsync())
{
System.Text.Json.JsonSerializerOptions options=new System.Text.Json.JsonSerializerOptions();
var result=await System.Text.Json.JsonSerializer.DeserializeAsync(流,选项);
//在这里对接收到的数据执行一些操作
}
}
当我在我的dev工作站上同时运行客户端和服务器时,请求一个任意大的数据集(300K记录),从服务器返回数据大约需要30秒。当我与来自客户机的直接数据库通信进行比较时,这已经不是很好了,它可以在大约15秒钟内完成。然而,我知道通过Web服务会有一些开销,而且响应时间刚好在可接受的范围内

然而,当我将webservice部署到单独VM上的IIS中(同样在Azure中)时,性能会大大降低,调用大约需要90秒来流式传输所有数据

我相信调用数据库的SqlDataReader会以二进制形式获取数据。因此,当服务在我的dev工作站上运行时,所有真实的网络流量都以二进制形式快速传输。但是,当服务部署到IIS中时,网络流量现在都是JSON,因此性能会下降。上面的时间是用gzip内容编码完成的,如果没有gzip内容编码,情况会更糟


那么我有什么选择呢?我想我正在寻找其他方法来将数据从服务传输到客户机,而不使用json?我可以使用二进制传输吗?或者我需要考虑使用gRPC吗?

当您序列化大量记录并通过http发送它们时,您希望发生什么?你可以压缩成一个文件或字节数组并提供服务。@Andy是的,我承认会有一些开销。但增加一个中间层来服务数据已经存在多年了。我不敢相信这种延迟是正常的,所以我假设还有其他方法可以做到。读取300000条记录是不“正常”的。是的,有很多方法可以解决这个问题,减少传输数据的大小是一个显而易见的方法。或者您可以在本地缓存并下载更改。或者在需要时下载他们需要使用的任何东西。为什么用户坐在那里等待所有数据的到来?@Andy,我想这取决于我们生活的世界。在我的世界里,30万张唱片是完全正常的,甚至都不大。这是一个数据门户,它接收实时报告的请求和数据源。无法缓存它,因为它将过时。我处理数百万行。我并不是一开始就把它们全部下载到客户端。如果报告的是300k记录,则在服务器上运行该报告。