如何使用Web API上传文件和模型?

J. *_*Doe 11 asp.net rest http asp.net-web-api asp.net-web-api2

基本上我正在尝试使用Web API 2上传图像和枚举.

这是控制器签名:

[HttpPost]
public UploadResponseVm Upload([FromBody]ResImageType type)
{
Run Code Online (Sandbox Code Playgroud)

问题是,每当我尝试发布多部分表单(带有文件和类型)时,我都会收到415错误:

{"Message":"此资源不支持请求实体的媒体类型'multipart/form-data'.","ExceptionMessage":"没有MediaTypeFormatter可用于从媒体类型的内容中读取'ResImageType'类型的对象'multipart/form-data'.","ExceptionType":"System.Net.Http.UnsupportedMediaTypeException","StackTrace":"at System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent内容,类型类型,IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable1格式化程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)"}

我甚至在startup.cs类中添加了以下内容:

    config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
Run Code Online (Sandbox Code Playgroud)

如何使用web api控制器上传模型和文件?

Nik*_*iko 0

没有格式化程序可以处理/与您的ResImageType对象相关。我曾经通过使用无参数方法在没有格式化程序的情况下解决了类似的问题,并处理了该方法内的数据。例如:

public async Task<HttpResponseMessage> PostFormData()
    {
        if (!Request.Content.IsMimeMultipartContent("form-data"))
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }

            string upDir= "PathOfDirectory";

            MultipartFormDataStreamProvider streamProvider = new MultipartFormDataStreamProvider(upDir);                
            MultipartFileStreamProvider multipartFileStreamProvider = await Request.Content.ReadAsMultipartAsync(streamProvider);

            // Loop through files.
            foreach (MultipartFileData file in streamProvider.FileData)
            {
                // Save filepaths to DB or do something else
            }
            return Request.CreateResponse(HttpStatusCode.OK);
    }
Run Code Online (Sandbox Code Playgroud)

MS Docs中的类似解决方案

另一种可能性是创建一个类似 DTO 的类,用于传输对象并使用格式化程序,例如MultipartDataMediaFormatter似乎合法(尚未尝试)。