2014-12-19 18 views
15

Tôi có phương pháp ASP.NET Web API này và tôi muốn đăng một đối tượng và trong cùng một thời điểm, một tệp!Gửi biểu mẫu dữ liệu VÀ một tệp tới 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)); 
    } 

Và tôi muốn gọi nó, vì vậy tôi gửi yêu cầu này http với cáy:

Tiêu đề:

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

Body:

---------------------------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-- 

tôi nhận được một lỗi 415 mã có văn bản trả lời:

{"nội dung": "Loại đa phương tiện của yêu cầu 'multipart/form-data' không được hỗ trợ cho tài nguyên này.", "ExceptionMessage": "Không có MediaTypeFormatter nào có sẵn để đọc đối tượng kiểu 'Cơ sở' từ nội dung với loại phương tiện truyền thông 'multipart/form-data'. "," exceptionType ":" System.Net.Http.UnsupportedMediaTypeException "," stackTrace ":" tại System.Net.Http.HttpContentExtensions.ReadAsAsync [T] (Nội dung HttpContent, Type loại, IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1 trình định dạng, IFormatterLogger formatterLogger, hủy bỏToken hủy bỏToken) \ r \ n tại System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync (HttpRequestMessage request, loại loại, IEnumerable`1 định dạng, IFormatterLogger formatterLogger, CancellationToken cancelToken) "}

Tôi đã tìm kiếm rất nhiều trước khi hỏi nhưng không tìm được giải pháp nào. Thnaks giúp đỡ.

EDIT:

Một lưu ý: Nếu tôi loại bỏ các "cơ sở" tham số, và để cho phương pháp này chỉ để tải lên các tập tin, nó hoạt động hoàn hảo, nhưng tôi muốn gửi JSON và một tập tin với nhau.

+0

Xin chào, bạn có giải pháp cho vấn đề này không? Tôi đang gặp vấn đề tương tự. – uikrosoft

+0

@uikrosoft, Không đặt đối số (tham số) trong hàm api (Làm cho nó không có tham số). Và nhận các giá trị tham số của bạn bên trong hàm đó từ nội dung bài đăng. Điều đó làm việc cho tôi. – Hashem

+0

Đây là hướng dẫn đầy đủ: http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2 –

Trả lời

3

"mulitpart/form-data" vì vậy chúng tôi đăng ký UploadMultipartMediaTypeFormatter

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

* đăng ký trong global.asax hoặc (xem mã sandbox)

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

Các WebAPI bây giờ sẽ gọi MediaTypeFormatter.ReadFromStreamAsync và chúng tôi có thể gọi phần mở rộng HttpContent.ReadAsMultipartAsync từ đó.

+0

Nhưng theo cách này, tôi không thể tải lên tệp, bài đăng không phải là đa phần nữa! Tôi có nói đúng không? – Hashem

+0

bạn nói đúng. bạn có thể vui lòng kiểm tra bài viết này. Tôi đã sửa câu trả lời của tôi –

+5

Thật không may là nó không hoạt động, nhưng tôi buộc phải thực hiện các phương thức CanReadType và CanWriteType và tôi trả về true. Khi tôi gọi api, tôi nhận được phản hồi 500 và không có nội dung! :( – Hashem

1

Tôi gặp vấn đề tương tự. Giải quyết bởi MultipartDataMediaFormatter cho ASP.NET WebApi. Cách sử dụng:

  1. Tìm và cài đặt từ gói Nuget MultipartDataMediaFormatter.
  2. Thêm định dạng hiện nay vào bộ sưu tập và định dạng WebAPI:

    • nếu WebAPI lưu trữ trên IIS (trên ứng dụng Start).:
      • GlobalConfiguration.Configuration.Formatters.Add(new FormMultipartEncodedMediaTypeFormatter());
    • nếu WebAPI là tự lưu trữ:

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

Sau đó bạn có thể gửi objec với tập tin cùng nhau trong một mô hình.

Lưu ý: Trong gói Nuget phiên bản 1.1.0 không phải là tệp cuối cùng. Chúng chưa được cập nhật. Có thể cài đặt phiên bản mới nhất theo cách thủ công.

+2

Một liên kết đến một giải pháp được hoan nghênh, nhưng hãy đảm bảo câu trả lời của bạn hữu ích mà không có nó: [thêm ngữ cảnh xung quanh liên kết] (// meta.stackexchange.com/a/8259) để người dùng của bạn sẽ có một số ý tưởng đó là lý do tại sao nó ở đó, sau đó trích dẫn phần có liên quan nhất của trang bạn đang liên kết đến trong trường hợp trang đích không có sẵn. [Câu trả lời có nhiều hơn một liên kết có thể bị xóa.] (// stackoverflow.com/ help/deleted-answers) –

Các vấn đề liên quan