2014-01-16 50 views
3

我试图发送一个或多个文件(.doc)到ASP.NET Web API 2服务并返回修改后的版本(.docx)。我能够发送文件并获得响应,但是在请求中的HTTPContent服务中使用的HttpContentMultipartExtensions在客户端不可用,无法在响应中使用。这是不是可用于开箱即可使用的东西,还是这是滥用多部分形式?Web API POST MultipartFormDataContent:可以响应返回multipartform内容吗?

有两种应用:MVC的客户端和Web API服务:

控制器的客户端(读取程序App_Data,POST样本文件serviceserver/API/mpformdata):

public async Task<ActionResult> PostMpFormData() 
{ 
    DirectoryInfo dir = new DirectoryInfo(Server.MapPath(@"~\App_Data")); 
    var files = dir.GetFiles().ToList(); 

    using (HttpClient client = new HttpClient()) 
    { 
     HttpResponseMessage result = new HttpResponseMessage(); 
     using (MultipartFormDataContent mpfdc = new MultipartFormDataContent()) 
     { 
      foreach (var file in files) 
      { 
       mpfdc.Add(new StreamContent(file.OpenRead()), "File", file.Name); 
      } 

      var requestUri = ConfigurationManager.AppSettings["DocumentConverterUrl"] + "/api/mpformdata"; 
      client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("multipart/form-data")); 
      result = client.PostAsync(requestUri, mpfdc).Result; 
     } 

     ViewBag.ResultStatusCode = result.StatusCode; 
     ViewBag.ContentLength = result.Content.Headers.ContentLength; 

     // Fiddler show that it returns multipartform content, but how do I use it? 
     // var resultContent = result.Content; 
    } 

    return View(); 
} 

控制器网络API服务:

public class UploadController : ApiController 
{ 
    [HttpPost, Route("api/mpformdata")] 
    public async Task<HttpResponseMessage> PostMpFormData() 
    { 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 
     return await UseMultipartFormDataStream(); 
    } 

    private async Task<HttpResponseMessage> UseMultipartFormDataStream() 
    { 
     string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
     var provider = new MultipartFormDataStreamProvider(root); 
     MultipartFormDataContent mpfdc = new MultipartFormDataContent(); 

     try 
     { 
      await Request.Content.ReadAsMultipartAsync(provider); 

      foreach (MultipartFileData file in provider.FileData) 
      { 
       var filename = file.Headers.ContentDisposition.FileName; 
       Trace.WriteLine(filename); 
       Trace.WriteLine("Server file path: " + file.LocalFileName); 
       mpfdc.Add(new ByteArrayContent(File.ReadAllBytes(file.LocalFileName)), "File", filename); 
      } 
      var response = Request.CreateResponse();  
      response.Content = mpfdc; 
      response.StatusCode = HttpStatusCode.OK; 
      return response; 
     } 
     catch (System.Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e); 
     } 
    } 
} 
+1

为什么不能在客户端上使用'ReadAsMultipartAsync'? –

+0

包含ReadAsMultipartAsync的HttpContentMultipartExtensions在HttpResponseMessage上不可用。它们仅在HttpRequestMessage上可用。 –

+0

这不是真的......这些扩展名在'HttpContent'上,你应该可以做'response.Content.ReadAsMultipartAsync' –

回答

5

多部分扩展名是System.Net.Http.Formatting dll的一部分。确保你的客户端安装了nuget包Microsoft.AspNet.WebApi.Client

+0

太棒了!谢谢! –

相关问题