将"application/octet-stream"发送到 ASP.NET 核心 Web API 服务时出现请求后错误



我需要创建一个ASP。. NET Core 3 Web API可以理解这个URL

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和我不能改变调用者的代码,这就是为什么我需要创建一个Web API来理解那个URL。

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

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

我在客户端得到的错误是:-

[System.Net。远程服务器返回一个错误:(415)
不支持的媒体类型。"} System.Net.WebException

提前感谢您的帮助

如果目标是读取原始请求内容,则可以使用HttpContext控制器属性来完成。HttpContext具有Request属性,提供对实际HTTP请求的访问。访问原始请求流不需要额外的模型属性或控制器参数。重要的是要注意,在这种情况下不应该使用FromBodyFromForm绑定。


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

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

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