Я пытаюсь отправить один или несколько файлов (.doc) в службу ASP.NET Web API 2 и вернуть измененную версию (.docx). Я могу отправить файл и получить ответ, но HttpContentMultipartExtensions, которые я использовал в службе HTTPContent в запросе, не доступны на клиенте для использования в ответе. Это что-то, что не доступно из коробки, которое может быть подключено, или это неправильное использование multipartform?Web API POST MultipartFormDataContent: Может ли ответ возвращать многоформатное содержимое?
Есть два приложения: клиент и Web API службы MVC:
Контроллер для клиента (читает файлы примеров из 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();
}
контроллера для Web сервис 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);
}
}
}
Почему вы не используете 'ReadAsMultipartAsync' на клиенте? –
HttpContentMultipartExtensions, включая ReadAsMultipartAsync, недоступны в HttpResponseMessage. Они доступны только в HttpRequestMessage. –
Это неверно ... эти расширения находятся на 'HttpContent', и вы должны быть способны выполнить ответ. Контент.ReadAsMultipartAsync' –