如何调用含Stream参数的.NET 6 MinimalAPI接口?
解决.NET 6 Minimal API 415 Unsupported Media Type问题
问题场景
基于.NET 6开发的Minimal API,封装文件存储接口:
app.MapPost( "DocumentStorage/CreateDocument/{documentId:int}", (IDocumentStorageManager documentStorageManager, int documentId, Stream stream) => { return documentStorageManager.CreateDocument(documentId, stream); });
使用HttpClient调用时,无论怎么调整写法,始终返回415 Unsupported Media Type错误:
using (var fileStream = File.Open(filePath, FileMode.Open)) { var uri = $"http://localhost:1234/DocumentStorage/CreateDocument/{123}"; var content = new StreamContent(fileStream); var httpRequestMessage = new HttpRequestMessage( HttpMethod.Post, uri) { Content = content }; var result = new HttpClient().SendAsync(httpRequestMessage).Result; }
错误响应:
{ StatusCode: 415, ReasonPhrase: 'Unsupported Media Type', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Date: Tue, 08 Nov 2022 21:41:48 GMT Server: Kestrel Content-Length: 0 } }
原因分析
- 请求Content-Type未指定:StreamContent默认不会设置Content-Type请求头,而Minimal API处理Stream参数时,需要明确的非multipart类型媒体标识。
- 参数绑定规则限制:当参数为Stream时,框架默认期望直接读取原始请求体,若请求使用multipart/form-data类型(比如表单上传)会触发415错误;未明确标记参数来源也可能导致绑定失败。
解决方案
方案1:调整HttpClient请求,指定正确的Content-Type
修改HttpClient调用代码,为StreamContent设置application/octet-stream类型的请求头:
using (var fileStream = File.Open(filePath, FileMode.Open)) { var uri = $"http://localhost:1234/DocumentStorage/CreateDocument/{123}"; var content = new StreamContent(fileStream); // 设置符合要求的媒体类型 content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); using var httpClient = new HttpClient(); var result = httpClient.SendAsync(new HttpRequestMessage(HttpMethod.Post, uri) { Content = content }).Result; // 处理响应示例 if (result.IsSuccessStatusCode) { var documentUri = result.Content.ReadAsStringAsync().Result; // 后续逻辑 } }
注意:避免重复创建HttpClient,建议复用实例或依赖注入
IHttpClientFactory管理。
方案2:优化Minimal API参数绑定(可选)
在API的Stream参数上添加[FromBody]标记,明确告知框架从请求体绑定该参数,增强代码可读性:
app.MapPost( "DocumentStorage/CreateDocument/{documentId:int}", (IDocumentStorageManager documentStorageManager, int documentId, [FromBody] Stream stream) => { return documentStorageManager.CreateDocument(documentId, stream); });
排查注意点
- 不要使用
MultipartFormDataContent发送请求,Stream参数无法绑定到multipart类型的请求体。 - 确保文件流未被提前读取或截断,比如
File.Open使用正确的FileMode.Open模式。
内容的提问来源于stack exchange,提问作者bubbleking
相关产品推荐
相关产品推荐

