2014-12-19 2 views
15

Mam tę metodę ASP.NET Web API i chcę wysłać obiekt w tym samym czasie, plik!Wysyłanie danych formularzy ORAZ plik do ASP.NET Web API

public async Task<IHttpActionResult> Post(Facility facility) 
    { 
     if (!ModelState.IsValid) 
      return BadRequest(); 

     // Check if the request contains multipart/form-data. 
     if (!Request.Content.IsMimeMultipartContent()) 
     { 
      throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); 
     } 

     string root = HttpContext.Current.Server.MapPath("~/App_Data"); 
     var provider = new MultipartFormDataStreamProvider(root); 

      // Read the form data. 
      await Request.Content.ReadAsMultipartAsync(provider); 

      // This illustrates how to get the file names. 
      foreach (MultipartFileData file in provider.FileData) 
      { 
       Trace.WriteLine(file.Headers.ContentDisposition.FileName); 
       Trace.WriteLine("Server file path: " + file.LocalFileName); 
      } 
      // Logic 
      // Login 

     return Ok(facilityManager.Insert(facility)); 
    } 

I chcę to nazwać, więc wysłać żądania http z Skrzypek:

Header:

Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468 
User-Agent: Fiddler 
Host: localhost:44301 
Content-Length: 3279 

ciała:

---------------------------acebdf13572468 
Content-Disposition: form-data; name="fieldNameHere"; filename="credits.txt" 
Content-Type: text/plain 

<@INCLUDE *C:\Program Files (x86)\Fiddler2\credits.txt*@> 
---------------------------acebdf13572468 
Content-Disposition: form-data; name="facility" 
Content-Type: application/json 
{ 
    "FacilityTypeId":"1" 
} 
---------------------------acebdf13572468-- 

pojawia się błąd 415 kod z tekstem odpowiedzi:

{"message": "Typ nośnika jednostki wniosku" multipart/dane-formularza "nie jest obsługiwany dla tego zasobu.", "ExceptionMessage": "Brak MediaTypeFormatter jest dostępny do odczytu obiektu typu" Obiekt "z treści z typem mediów "multipart/form-data". "," exceptionType ":" System.Net.Http.UnsupportedMediaTypeException "," stackTrace ":" at System.Net.Http.HttpContentExtensions.ReadAsAsync [T] (zawartość HttpContent, typ typ IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1 formatujących, IFormatterLogger formatterLogger, cancellationToken cancellationToken) \ r \ n co System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync (HttpRequestMessage żądanie typu Type formatujących IEnumerable`1, IFormatterLogger formatterLogger, cancellationToken cancellationToken) "}

Dużo szukałem, ale nie mogłem znaleźć żadnego rozwiązania. Dzięki za pomoc.

EDIT:

Uwaga: Jeśli usunąć parametr „Kredyt”, i niech metodę tylko do przesyłania plików, działa idealnie, ale chcę, aby umieścić plik JSON i razem.

+0

Witam, czy masz rozwiązanie tego problemu? Mam ten sam problem. – uikrosoft

+0

@uikrosoft, Nie ustawiaj argumentów (parametrów) w funkcji api (Ustaw bez parametrów). I uzyskaj wartości parametrów wewnątrz tej funkcji z treści postu. To działało dla mnie. – Hashem

+0

Oto kompletny samouczek: http://www.asp.net/web-api/overview/advanced/sending-html-form-data--part-2 –

Odpowiedz

3

"mulitpart/form-data", więc zarejestrowania UploadMultipartMediaTypeFormatter

public class UploadMultipartMediaTypeFormatter : MediaTypeFormatter 
{ 
    UploadMultipartMediaTypeFormatter() 
    { 
     SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data")); 
    } 
} 

* zarejestrować w global.asax lub (patrz kod sandbox)

config.Formatters.Add(new UploadMultipartMediaTypeFormatter()); 

WebAPI będzie teraz nazywają MediaTypeFormatter.ReadFromStreamAsync i możemy stąd wywołać rozszerzenie HttpContent.ReadAsMultipartAsync.

+0

Ale w ten sposób nie mogłem uzyskać przesłanego pliku plik, post nie jest już wieloczęściowy! Czy mówię dobrze? – Hashem

+0

masz rację. czy możesz sprawdzić ten artykuł. edytowałem moją odpowiedź –

+5

Niestety nie zadziałało, ale zmusiłem do wdrożenia metod CanReadType i CanWriteType i zwróciłem prawdę. Kiedy zadzwonię do API, otrzymuję odpowiedź 500 i brak treści! :( – Hashem

1

Miałem ten sam problem. Rozwiązany przez MultipartDataMediaFormatter dla ASP.NET WebApi. Jak używać:

  1. znaleźć i zainstalować z pakietów Nuget MultipartDataMediaFormatter.
  2. Dodaj aktualny formatowania do kolekcji formatujących WebAPI:

    • jeśli WebAPI gospodarzem na IIS (na uruchomieniu aplikacji).:
      • GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
    • jeśli WebAPI jest self-hosted:

      • new HttpSelfHostConfiguration(<url>).Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());

Po tym można zakładać objec z złożyć razem w jednym modelu.

Uwaga: W pakietach Nuget wersja 1.1.0 nie jest ostatnia. Nie są jeszcze aktualizowane. Możliwe, że możliwe jest ręczne zainstalowanie najnowszej wersji.

+2

Link do rozwiązania jest mile widziany, ale upewnij się, że twoja odpowiedź jest przydatna bez niego: [dodaj kontekst związany z linkiem] (// meta.stackexchange.com/a/8259), aby Twoi koledzy użytkownicy mieli pewne pojęcie to jest i dlaczego jest tam, a następnie zacytuj najbardziej odpowiednią część strony, do której się łączysz, jeśli strona docelowa jest niedostępna. [Odpowiedzi, które są niewiele więcej niż linkem, mogą zostać usunięte.] (// stackoverflow.com/ pomoc/usunięte-odpowiedzi) –