Hãy xem xét một dịch vụ web được viết bằng ASP.NET Web API để chấp nhận bất kỳ tệp số nào dưới dạng yêu cầu 'multipart/mixed'. Các helper phương pháp mat trông như sau (giả sử _client
là một thể hiện của System.Net.Http.HttpClient
):Làm thế nào để thực hiện đúng một MediaTypeFormatter để xử lý các yêu cầu của loại 'multipart/mixed'?
public T Post<T>(string requestUri, T value, params Stream[] streams)
{
var requestMessage = new HttpRequestMessage();
var objectContent = requestMessage.CreateContent(
value,
MediaTypeHeaderValue.Parse("application/json"),
new MediaTypeFormatter[] {new JsonMediaTypeFormatter()},
new FormatterSelector());
var content = new MultipartContent();
content.Add(objectContent);
foreach (var stream in streams)
{
var streamContent = new StreamContent(stream);
streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
streamContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("form-data")
{
Name = "file",
FileName = "mystream.doc"
};
content.Add(streamContent);
}
return _httpClient.PostAsync(requestUri, content)
.ContinueWith(t => t.Result.Content.ReadAsAsync<T>()).Unwrap().Result;
}
Phương pháp mà chấp nhận yêu cầu trong lớp con của ApiController có một chữ ký như sau:
public HttpResponseMessage Post(HttpRequestMessage request)
{
/* parse request using MultipartFormDataStreamProvider */
}
Lý tưởng nhất, Tôi muốn định nghĩa nó như thế này, nơi liên hệ, nguồn và đích được trích xuất từ nội dung 'multipart/mixed' dựa trên thuộc tính 'name' của tiêu đề 'Content-Disposition'.
public HttpResponseMessage Post(Contact contact, Stream source, Stream target)
{
// process contact, source and target
}
Tuy nhiên, với chữ ký hiện tại của tôi, đăng dữ liệu đến kết quả máy chủ trong một InvalidOperationException
với một thông báo lỗi của:
Không 'MediaTypeFormatter' có sẵn để đọc một đối tượng kiểu ' HttpRequestMessage 'với loại phương tiện' multipart/mixed '.
Có một số ví dụ trên internet cách gửi và nhận tệp bằng ASP.NET Web API và HttpClient. Tuy nhiên, tôi đã không tìm thấy bất kỳ điều gì cho thấy làm thế nào để đối phó với vấn đề này.
Tôi bắt đầu xem xét triển khai MediaTypeFormatter
tùy chỉnh và đăng ký cấu hình này với cấu hình chung. Tuy nhiên, trong khi nó rất dễ dàng để đối phó với serializing XML và JSON trong một tùy chỉnh MediaTypeFormatter
, nó là không rõ ràng làm thế nào để đối phó với 'multipart/hỗn hợp' yêu cầu mà có thể khá nhiều bất cứ điều gì.
Có vẻ như để làm việc tuyệt vời với dữ liệu biểu mẫu chuẩn, nhưng tôi có một số thách thức khi tải trọng chứa luồng nhị phân. Tôi đã bỏ ý tưởng này và phân tích cú pháp tải trọng như được mô tả [ở đây] (http://www.asp.net/web-api/overview/formats-and-model-binding/html-forms-and-multipart-mime). Dịch vụ được lưu trữ trong IIS. – bloudraak
Các giải pháp mà tôi đã cung cấp được áp dụng cho .Net 4.5 Beta. Bây giờ MS đang vận chuyển .Net 4.5RC có một cách tương tự nhưng sạch hơn để xử lý dữ liệu nhị phân. Thanh toán bài đăng trên blog này: http://byterot.blogspot.com/2012/04/aspnet-web-api-series-part-5.html – Jed