asp.net-core - 向 ASP.NET Core Web API 服务发送 "application/octet-stream"时发布请求错误

标签 asp.net-core asp.net-core-webapi

我需要创建一个能够理解此 URL 的 ASP.NET Core 3 Web API

http://myapp.com/MyASPNetCore3WebApi/myController/myWebMethod?user=A0001

和一个作为内容的 zip 文件。这是调用所需 API 的代码,我需要创建它:

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(URI);
httpWebRequest.Timeout = -1;
httpWebRequest.KeepAlive = false;
httpWebRequest.Method = "POST";
httpWebRequest.ProtocolVersion = HttpVersion.Version10;
httpWebRequest.ContentType = "application/octet-stream";
httpWebRequest.Accept = "application/octet-stream";
httpWebRequest.ContentLength = data.Length;

Stream requestStream = httpWebRequest.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();

HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();

上面的代码工作正常,它每天都会使用,将数据发送到 java web 服务,现在我正在用 ASP.NET Core 中的新系统替换该系统,并且我无法更改调用者的代码,这就是为什么我需要创建一个能够理解该 URL 的 Web API。

我已经在我的 Web API 中编写了这段代码,但我想我遗漏了一些我无法弄清楚的东西,因为我在客户端收到错误(上面的代码)

[HttpPost("myWebMethod")]
public FileStreamResult myWebMethod(string user, [FromBody]  Stream compress)
{
    byte[] zip = ((MemoryStream)compress).ToArray();
    byte[] data = ZipHelper.Uncompress(zip);
    .....................
}

我在客户端收到的错误是这样的:-

[System.Net.WebException] {"The remote server returned an error: (415)
Unsupported Media Type."} System.Net.WebException

预先感谢您的帮助

最佳答案

如果目标是读取原始请求内容,可以使用HttpContext来完成。 Controller 属性。 HttpContextRequest提供对实际 HTTP 请求的访问的属性。 不需要额外的模型属性或 Controller 参数来访问原始请求流。请务必注意,在这种情况下不应使用 FromBodyFromForm 绑定(bind)。


有一些关于原始问题示例中的代码的注释。

byte[] zip = ((MemoryStream)compress).ToArray();
byte[] data = ZipHelper.Uncompress(zip);

  1. HttpContext.Request.Body 属性不返回 MemoryStream,它返回它自己的 Stream 实现。这意味着没有 ToArray 方法。
  2. 将请求的全部内容直接读取到服务器内存时,最好检查内容长度,否则客户端可能会因发送足够大的请求而导致服务器崩溃。
  3. 在读取请求内容时使用*异步方法可以提高性能。

关于asp.net-core - 向 ASP.NET Core Web API 服务发送 "application/octet-stream"时发布请求错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68734387/

相关文章:

asp.net-core - ASP.NET Core 应用程序的调试设置

asp.net-core - CustomRequestCultureProvider : context. User.Identity.IsAuthenticated 始终为 false

c# - 如何在asp.net-core webapi中使用unity-container拦截

.NET 独立后端和 WebAPI 与否

asp.net-core - 在 VS 2019 预览版中没有可用于使用 .Net Core 3.0 的选项

c# - 是否可以有多个仅因 ASP.NET Core 中的参数而异的 GET?

c# - 将 IHttpContextAcessor 注入(inject)到 Controller 操作内的绑定(bind)模型中

c# - 大小超过64KB的请求无法完成(Asp.Net Core Web API)

c# - 从 ASP.NET Core 3.1 端点流式传输数据而不消耗大量内存

c# - .NET Standard 2、.NET Core 2、HttpClient 未按预期运行(传递 null)