首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在HttpClient 6.0中发送json对象和IFormFile时,IFormFile返回不支持的媒体类型错误

在HttpClient 6.0中发送json对象和IFormFile时,IFormFile返回不支持的媒体类型错误
EN

Stack Overflow用户
提问于 2022-08-23 07:06:45
回答 1查看 99关注 0票数 1

过去三天,我一直在努力将复杂类型的序列化json (称为fileItem的DTO对象)和名为文件的IFormFile类型发送到我的API中的一个,它接受两个输入,一个FileItem对象和IFormFile对象。

但是我一直收到一个错误“不支持的媒体类型”。请注意,当我只发送文件或仅将对象发送到API端点时,通过更新端点以只接受文件或只接受complexType,那么它可以正常工作,但如果同时发送这两个文件,则会得到“不支持的媒体类型”错误,该错误在我发送的请求中已经可用

请指导我正确的方向,你的帮助将是非常感谢的。

ASP.NET MVC web应用程序

代码语言:javascript
代码运行次数:0
运行
复制
public async Task<string> SaveFiles(FileItem _fileItem2, IFormFile _file)
{
    using (var multipartFormContent = new MultipartFormDataContent())
    {
        var fileItem = new StringContent(
        JsonSerializer.Serialize(_fileItem2), Encoding.UTF8, Application.Json);
        multipartFormContent.Add(fileItem, "fileItem");

        // Add the file
        var fileStreamContent = new StreamContent(_file.OpenReadStream());
        fileStreamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(_file.ContentType);
        multipartFormContent.Add(fileStreamContent, name: "file", _file.FileName);

        // Method 1 : this method returns Unsupported media type, but if file is removed then it works fine.
        var response = await httpClient.PostAsync("/Upload/SaveFileWithData", multipartFormContent);

        // Method 2 : this method also returns Unsupported media type, but if file is removed then it works fine.
        var request = new HttpRequestMessage(HttpMethod.Post, "/Upload/SaveFileWithData");
        request.Content = multipartFormContent;
        var responsemsg = await httpClient.SendAsync(request);

        responsemsg.EnsureSuccessStatusCode();

        return await responsemsg.Content.ReadAsStringAsync();
    }
}

这是.NET 6.0WebAPI(上面我们发送给这个API的请求)。

代码语言:javascript
代码运行次数:0
运行
复制
[HttpPost()]
[Route("SaveFileWithData")]
public async Task<string> SaveFileWithData(FileItem? fileItem, IFormFile? file)
{
    int i = 2;
    return "fileSavedSuccessfully";
}
EN

回答 1

Stack Overflow用户

发布于 2022-08-24 03:44:56

下面是一个您可以遵循的完整的工作演示:

型号:

代码语言:javascript
代码运行次数:0
运行
复制
public class FileItem
{
    public string FileName { get; set; }
    public string Type { get; set; }
}

MVC:

代码语言:javascript
代码运行次数:0
运行
复制
[HttpPost]
public async Task<string> SaveFiles(FileItem _fileItem2, IFormFile _file)
{
    HttpClient httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri("https://localhost:7241/");
    using (var multipartFormContent = new MultipartFormDataContent())
    {

        multipartFormContent.Add(new StringContent(_fileItem2.FileName), "FileName");
        multipartFormContent.Add(new StringContent(_fileItem2.Type), "Type");

        var fileStreamContent = new StreamContent(_file.OpenReadStream());
        
        multipartFormContent.Add(fileStreamContent, name: "file", _file.FileName);

        var response = await httpClient.PostAsync("/Upload/SaveFileWithData", multipartFormContent);

        //...
    }
}

网络APi:

代码语言:javascript
代码运行次数:0
运行
复制
[HttpPost()]
[Route("SaveFileWithData")]
public async Task<string> SaveFileWithData([FromForm]FileItem? fileItem, [FromForm] IFormFile? file)
{
    int i = 2;
    return "fileSavedSuccessfully";
}

注意:非空属性必须是ASP.NET 6中的,确保您通过HttpClient发布了所有属性,否则您将收到400个坏请求。

如果不需要所需的所有属性,可以检查下面的引用:https://stackoverflow.com/a/71701358/11398810

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73454461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档