You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:01:13