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

时间:2018-10-24 14:05:31

标签: c# rest asp.net-core streaming

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

我定义了一个连续流,例如有人正在对着麦克风讲话,并且声音直接发送而未保存到本地文件)到Rest API,以保存到文件中。

我已经在Google上搜索了很多类似的东西,但到目前为止找不到真正有用的东西。

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

到目前为止,这是我要在客户端进行的操作

string TARGETURL = "http://localhost:58000/api/file/";
string filePath = @"G:\Voice\Samples\The 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:\Voice\Samples\dummy.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);
}

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

  

请求的Content-Length 304137380大于请求正文大小限制30000000。

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

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

1 个答案:

答案 0 :(得分:0)

您可能想要做的是使用其他网络堆栈。 Web应用程序总是会尝试将所有内容都适合HTTP。这是一种非常特定的通信方式。 REST也基于这些想法。事物通常是Internet上的引用文档,而REST是对该思想的扩展。

但是,它确实位于其他一些可能会更适合您需要的出色技术之上。

没有什么可以阻止您使用Internet,但是也许您需要研究UDP或TCP级别的实现。请注意,您仍将以数据包形式发送信息。互联网上没有持续不断的比特流。现实世界中的声波是无限的东西,但是计算机却是垃圾。

也许首先看一下at using socketsNAudio之类的库。