我需要创建一个能够理解此 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 属性。 HttpContext
有 Request
提供对实际 HTTP 请求的访问的属性。
不需要额外的模型属性或 Controller 参数来访问原始请求流。请务必注意,在这种情况下不应使用 FromBody
和 FromForm
绑定(bind)。
有一些关于原始问题示例中的代码的注释。
byte[] zip = ((MemoryStream)compress).ToArray();
byte[] data = ZipHelper.Uncompress(zip);
HttpContext.Request.Body
属性不返回MemoryStream
,它返回它自己的Stream
实现。这意味着没有ToArray
方法。- 将请求的全部内容直接读取到服务器内存时,最好检查内容长度,否则客户端可能会因发送足够大的请求而导致服务器崩溃。
- 在读取请求内容时使用*异步方法可以提高性能。
关于asp.net-core - 向 ASP.NET Core Web API 服务发送 "application/octet-stream"时发布请求错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68734387/