将包含文件的模型从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"。
这是因为它试图序列化文件的输入流。我建议为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
和一切正常工作。