WCF Restful Service - отправка файла с несколькими полями в одном запросе - PullRequest
2 голосов
/ 26 июля 2011

Я нахожусь в процессе разработки WCF Restful Service. Одно из требований WCF - разрешить клиенту загружать файл изображения и несколько входных параметров, которые могут содержать несколько значений.

Я думал о нескольких способах отправки файла с входными параметрами в одном запросе. Я не уверен, какой будет наилучший подход.

1) Принять поток, который содержит многочастный поток данных формы. Огромным недостатком этого подхода является то, что мне приходится писать многочастный парсер. (AspNetCompatibilityEnabled = "ложь")

[WebInvoke (UriTemplate = "Account",Method = "POST")]
public String Account(System.IO.Stream stream) {
MultiPartParser(stream);
}

2) Отправьте файл в виде потока и отправьте другие данные в QueryString. Единственная проблема с этим подходом состоит в том, что значения могут быть многострочными текстовыми данными.

[WebInvoke (UriTemplate = "Account?input1={val1}&input2={val2}",Method = "POST")]
public String Account(System.IO.Stream stream) {

}

3) Преобразовать файл как строку Base64, инкапсулировать его в JSON или XML и отправить его с другими входными параметрами. Есть ли ограничения этого подхода?

[WebInvoke (UriTemplate = "Account",Method = "POST")]
public String Account(String ImageFile, String input1, String input2) {

}

Каков наилучший подход? Спасибо за ваше время.

1 Ответ

2 голосов
/ 26 июля 2011

Как всегда, ответ «это зависит».Вы упомянули плюсы и минусы каждого подхода, поэтому он действительно будет зависеть от вашей ситуации.

  1. Pro: содержимое файла не кодируется (т. Е. Размер не увеличивается).Con: вам нужно написать составной синтаксический анализатор на сервере (и упаковать запрос на клиенте), составные заголовки добавят некоторые (часто несущественные) издержки к запросам

  2. Pro: просто, операция легко написать.Con: может потребоваться URL-кодирование символов, таких как новая строка;Ограничение размера URI может быть проблемой, если дополнительные данные велики

  3. Pro: нет необходимости в кодировании, операция проста в написании.Con: увеличение размера из-за base64-кодировки (вы можете объявить параметр как byte [], чтобы декодирование выполнялось автоматически для вас), клиенту необходимо будет кодировать содержимое файла, а также обернуть все параметры из запроса.

Существует также четвертый вариант, который заключается в передаче дополнительных параметров в виде заголовков HTTP.

  1. Pro: нет ограничений по размеру, как в URI.Con: параметры не объявлены явно, их нужно извлекать из заголовков с помощью WebOperationContext, и все же необходимо кодировать символы URI вне диапазона 0x20-0x7E
...