将包含文件的模型从MVC站点发送到Web Api站点

本文关键字:站点 Web Api MVC 文件 包含 模型 | 更新日期: 2023-09-27 18:15:25

我有一个ASP。Net MVC站点,允许用户在上传文件的同时提交表单。

这部分工作。但在我的MVC Post方法中,我需要调用ASP。Net Web API方法,并将模型传递给它。

这是我不知道怎么做的部分。

这是我的模型在我的MVC应用:

public class MyModel
{
    public DateTime SubmittedDate { get; set; }
    public string Comments { get; set; }   
    public IEnumerable<HttpPostedFileBase> Files { get; set; }
}

在我的MVC网站我有以下方法:

[HttpPost]
public async Task<ActionResult> Details(MyModel model)
{
    if (!ModelState.IsValid)
    // the rest of the method
}

在这种方法中,文件和模型被正确填充。当我设置一个断点并导航到Files属性时,我可以看到具有正确名称和文件类型的正确数量的文件。

在我的Details方法中,我想调用另一个Web API站点上的方法。

下面是Web API站点上的方法:

[HttpPost]
public HttpResponseMessage Foo(MyModel myModel)
{
    // do stuff
}

通常在我的MVC方法中,我会使用PostAsJsonAsync方法使用HttpClient类调用Web API。

但是当我这样做的时候:

HttpResponseMessage response = await httpClient.PostAsJsonAsync(urlServiceCall, myModel);

我收到这个错误:

Newtonsoft.Json.JsonSerializationException

附加信息:从'ReadTimeout'获取值出错"System.Web.HttpInputStream"。

将包含文件的模型从MVC站点发送到Web Api站点

这是因为它试图序列化文件的输入流。我建议为web api创建一个新的模型,将流作为字节数组。

public class PostedFile {
    public int ContentLength { get; set; }
    public string ContentType { get; set; }
    public string FileName { get; set; }
    public byte[] Data { get; set; }
}
public class WebApiModel {
    public DateTime SubmittedDate { get; set; }
    public string Comments { get; set; }
    public List<PostedFile> Files { get; set; }
}

序列化器处理数组会比处理流做得更好。

我最终起诉了Nkosi的建议。

我为Web Api创建了一个新模型:

public class OtherModel
{
    public string Comments { get; set; }
    public List<byte[]> FileData { get; set; }
}

在我的MVC方法中,我使用了下面的读取HttpPostFiles:

foreach (var file in model.Files)
{
    byte[] fileData = new byte[file.ContentLength];                
    await file.InputStream.ReadAsync(fileData, 0, file.ContentLength);
    testModel.FileData.Add(fileData);
}

现在我可以使用HttpClient使用PostAsJsonAsync和一切正常工作。