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

时间:2016-10-27 13:11:45

标签: c# asp.net-mvc asp.net-web-api

我有一个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'。

2 个答案:

答案 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; }
}

序列化程序对阵列的效果要好于流。