我有一个ASP.Net MVC网站,允许用户提交表单以及上传文件。
这部分有效。但是在我的MVC Post方法中,我需要调用ASP.Net Web API方法并将其传递给模型。
这是我不知道该怎么做的部分。
这是我的MVC App中的模型:
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站点上调用一个方法。
以下是Web API网站上的方法:
[HttpPost]
public HttpResponseMessage Foo(MyModel myModel)
{
// do stuff
}
通常在我的MVC方法中,我会使用HttpClient
方法使用PostAsJsonAsync
类调用Web API。
但是当我这样做时:
HttpResponseMessage response = await httpClient.PostAsJsonAsync(urlServiceCall, myModel);
我收到此错误:
Newtonsoft.Json.JsonSerializationException
其他信息:从'ReadTimeout'获取值时出错 'System.Web.HttpInputStream'。
答案 0 :(得分:1)
我最终起诉了Nkosi的建议。
我为Web Api创建了一个新模型:
public class OtherModel
{
public string Comments { get; set; }
public List<byte[]> FileData { get; set; }
}
在我的MVC方法中,我使用了以下Read the 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);
}
现在我可以使用PostAsJsonAsync
使用HttpClient,一切正常。
答案 1 :(得分:1)
这是因为它试图序列化文件的输入流。我建议为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; }
}
序列化程序对阵列的效果要好于流。