小编bob*_*bob的帖子

多个异步文件上传与分块到ASP.Net Web API

我已经阅读了许多密切相关的问题,但没有一个能够完全达到这个问题.如果是重复,请发给我一个链接.

我正在使用一个有角度版本的flowjs库来进行HTML5文件上传(https://github.com/flowjs/ng-flow).这非常有效,我能够以1MB的块同时上传多个文件.有一个ASP.Net Web API文件控制器接受这些并将它们保存在磁盘上.虽然我可以做到这一点,但我并没有有效地做到这一点,并且想要了解更好的方法.

首先,我在异步方法中使用了MultipartFormDataStreamProvider,只要将文件上传到一个块中,该方法就能很好地工作.然后我切换到只使用FileStream将文件写入磁盘.只要块按顺序到达,这也有效,但当然,我不能依赖它.

接下来,为了看到它工作,我将块写入单个文件流并在事后合并它们,因此效率低下.一个1GB的文件将生成一千个上传完成后需要读取和重写的块.我可以将所有文件块保存在内存中,并在它们全部上传后刷新它们,但我担心服务器会爆炸.

似乎应该有一个很好的异步解决方案来解决这个困境,但我不知道它是什么.一种可能性是在写入当前块时使用async/ await组合先前的块.另一个可能是使用Begin/ EndInvoke来创建一个单独的线程,以便磁盘上的文件操作独立于从中读取的线程处理,HttpContext但这将依赖于ThreadPool我,我担心当我的MVC控制器时创建的线程将被过度终止回报.我可以创建一个FileWatcher完全独立于ASP.Net的程序,但这将是非常笨拙的.

所以我的问题是,1)是否有一个我想念的简单解决方案?(似乎应该有)和2)如果没有,在Web API框架内解决这个问题的最佳方法是什么?

谢谢,鲍勃

c# asp.net multithreading asynchronous asp.net-web-api

9
推荐指数
2
解决办法
6336
查看次数

ArrayList展开

Powershell展开让我发疯.

我有以下代码从交换收件人检索电子邮件地址.我正在使用ArrayList,因为当你想要从数组中删除项目时,很多人都建议使用它.

$aliases = New-Object System.Collections.ArrayList
$smtpAddresses = (Get-Recipient $this.DN).EmailAddresses | ?{$_.Prefix.ToString() -eq 'smtp' } 
    foreach ($smtpAddress in $smtpAddresses) {
        $aliases.Add($smtpAddress.SmtpAddress)
    }
return $aliases
Run Code Online (Sandbox Code Playgroud)

$ aliases的值在函数末尾是正确的(即将包含x个电子邮件地址并且类型为ArrayList)但在返回后它变为System.Object []并且具有2x个条目.有x Int32后跟x字符串(即{0,1,bob @ here,bob @ there}).为什么会发生这种情况以及如何保持ArrayList完好无损?我使用ArrayList错了吗?

出于好奇,由于PS展开导致的所有问题/问题,它的目的是什么?PowerShell的最大好处是你直接使用对象而不是文本投影,不幸的是,我从来不知道我正在使用什么样的对象 - 甚至当我检查时,它似乎没有保持其形状更多比几行代码.

- 编辑该函数作为PSObject的一部分调用

$get_aliases = { ... }
$obj | Add-Member -MemberType ScriptProperty -Name Aliases -Value $get_aliases -SecondValue $set_aliases
Run Code Online (Sandbox Code Playgroud)

powershell

8
推荐指数
1
解决办法
3370
查看次数

ASP.NET Core 3 MVC 路由调试

有哪些方法可用于调试 ASP.NET Core 3.1 Web API 中的路由问题?具体来说,就是臭名昭著的 404。

我在 Web API 中看到了大量与此相关的问题,但它们都涉及个人的具体问题。我正在寻找一种系统的方法来确定我的网址如何/为何匹配或未能匹配路线集合中的每个路线。

不幸的是,即使设置为 Trace,日志输出也仅显示:

Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request starting HTTP/2.0 GET https://localhost:5000/Ctrlr/Action  
Microsoft.AspNetCore.Hosting.Internal.WebHost:Information: Request finished in 8.4141ms 404   
Run Code Online (Sandbox Code Playgroud)

Phil Haack 的经典 ASP.NET MVC 路由调试器是一个很棒的工具,但我不相信它可以在 .NET Core 3 中使用。

我觉得我错过了一些巨大的东西,但我看起来没有成功。

谢谢

asp.net-web-api asp.net-core-3.1

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

如何编写 EF Core Query 以过滤多个表?

将 ASP Core 2 与 EF Core 和 SQL Server 一起使用。我有,我认为检索给定分销商的制造商(或单个制造商)列表是一项简单的任务。

Users 表提供经过身份验证的用户,每个用户都与一个分销商相关联(在模型中表示为_user)。因此,当在GetManufacturers()上调用操作时ManufacturersController,它应该返回给定分销商的所有制造商。同样,GetManufacturers(int id)如果它与经过验证的分销商相关联,则应返回单个制造商。

表

为此,我正在尝试各种公式,例如:

await _context.Manufacturers
    .Include(a => a.Addresses)
    .Include(m => m.DistributorManufacturers)
    .Where (a => a.AddressesNavigation.State = "CA")
    .Where (m => m.Id == id)   // Manufacturers Id
    .Where (d => d.DistributorManufacturers.DistributorId == _user.DistributorId)
    .AsNoTracking()
    .ToListAsyc()
Run Code Online (Sandbox Code Playgroud)

VS 抱怨ICollection<DistributorManufacturers>不包含定义DistributorId(即使我从类中复制/粘贴了它)。它与我的地址过滤器在概念上没有区别。

我也尝试.ThenInclude添加分销商表,但没有运气。

DistributorManufacturers 表是使用 Scaffold-DbContext 创建的,并定义了外键和导航属性。

c# entity-framework-core asp.net-core

4
推荐指数
1
解决办法
9334
查看次数

为 Invoke-Command 序列化 PsObject

我正在寻找使用 Invoke-Command 将 PsObject 传递到远程函数的最佳或正确方法。ConvertTo-Xml 非常适合序列化,但没有内置的反向 cmdlet。我在网上找到的解决方案都是针对具体内容的。

我实现了以下函数,这些函数适用于我测试的几个对象,但看起来相当老套。这是要咬我吗?有没有更好但仍然简单的解决方案?

function Get-TmpFileName () {...}

function Serialize-PsObject($obj) {
    $tmpFile = Get-TmpFileName
    Export-Clixml -InputObject $obj -Path $tmpFile
    $serializedObj = Get-Content $tmpFile
    Remove-Item $tmpFile
    $serializedObj
}

function Deserialize-PsObject($obj) {
    $tmpFile = Get-TmpFileName
    $obj > $tmpFile
    $deserializedObj = Import-Clixml $tmpFile
    Remove-Item $tmpFile
    $deserializedObj
}
Run Code Online (Sandbox Code Playgroud)

powershell powershell-remoting

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