如何将连续流发送到 ASP Core REST API



我正在尝试将连续流从C#应用程序发送到ASP Core REST API。

我定义了一个连续流,例如有人对着麦克风说话,声音直接发送到 Rest API 以保存到文件中。

我一直在谷歌上搜索很多类似的东西,到目前为止找不到任何真正有用的东西。

我一直试图通过发送一个大文件(297MB(来模拟它。

到目前为止,这是我对客户端的内容:

string TARGETURL = "http://localhost:58000/api/file/";
string filePath = @"G:VoiceSamplesThe Monkey's Paw.wav";
byte[] fileContent = File.ReadAllBytes(filePath);
var dummyStream = new MemoryStream(fileContent);
var inputData = new StreamContent(dummyStream);
HttpResponseMessage response = this._httpClient.PostAsync(TARGETURL, inputData).Result;
HttpContent result = response.Content;
if (response.IsSuccessStatusCode)
{
string contents = result.ReadAsStringAsync().Result;
}
else
{
// do something
}

对于服务器端:

[Route("")]
[HttpPost]
public async Task<JsonResult> Post()
{
Dictionary<string, object> rv = new Dictionary<string, object>();
try
{
string file = Path.Combine(@"G:VoiceSamplesdummy.txt");
using (FileStream fs = new FileStream(file, FileMode.Create, FileAccess.Write,
FileShare.None, 4096, useAsync: true))
{
await Request.Body.CopyToAsync(fs);
}
// complete the transaction
rv.Add("success", true);
rv.Add("error", "");
}
catch(Exception ex)
{
}
return Json(rv);
}

当我发送文件时,服务器抛出以下异常:

请求的内容长度304137380大于请求正文大小限制 30000000。

我知道我可以增加体型限制,但这不是一个长期的解决方案,因为流长度可能会比我设置的任何限制更长。

这就是为什么我试图找到一种解决方案,该解决方案按块发送流,以便服务器重建并写入文件。

您可能想要做的是使用不同的网络堆栈。Web应用程序总是会尝试将所有内容放入HTTP中。这是一种非常特殊的沟通方式。REST也是建立在这些想法之上的。事情通常是作为互联网上引用的文档,而REST是这个想法的扩展。

然而,它确实位于其他一些可能更适合您需求的伟大技术之上。

没有什么可以阻止您使用互联网,但也许您需要查看可能的UDP或TCP级别的实现。请注意,您仍将以数据包的形式发送信息。互联网上没有源源不断的比特流。现实世界中的声波是无限的,但计算机在这方面是垃圾。

也许从使用套接字和像 NAudio 这样的库开始。

最新更新