2012-01-17 2 views
1

Я работаю с услугой RESTful WCF. Один из методов службы возвращает байт [] (который содержит файл).Restful WCF Service - возвращаемый байт []?

На стороне клиента у меня есть код, который использует класс WebRequest для вызова этого конкретного метода службы. Используя WebRequest, я получаю поток ответа, как:

Stream stream = webReq.GetResponse().GetResponseStream();

Из этого потока, я затем реконструировать байт [], а затем выводит файл локально. Проблема в том, что восстановленный файл на стороне клиента не похож на файл, который был возвращен со стороны службы (я получаю поврежденный PDF-файл, размер которого намного больше размера, чем тот, который был отправлен со стороны службы). Перед тем, как метод службы вернет байт [], я вывел этот байт [] на диск со стороны службы, и он создал файл в порядке ... Это указывает на то, что происходит неправильный способ возврата байта [] и моей клиентской стороны реконструкции Byte [] из потока на стороне клиента ... восстановить байт [] из потока, я использую следующий метод, который кто-то писал в прошлом на StackOverflow:

public static byte[] ReadFully(Stream input) 
{  
    byte[] buffer = new byte[16*1024];  
    using (MemoryStream ms = new MemoryStream())  
    {   
     int read;   
     while ((read = input.Read(buffer, 0, buffer.Length)) > 0)   
     { 
      ms.Write(buffer, 0, read);   
     }   
     return ms.ToArray();  
    } 
} 

Любые идеи что может пойти не так?

+0

Можете ли вы разместить скелет своего сервиса и конфигурацию из файла конфигурации для службы? – Rajesh

ответ

1

Я полагаю, что ответ с сервера содержит еще один конверт в дополнение к необработанным байтам. Как конверт XML или что-то в этом роде. Который, конечно же, предположил бы, что байты base64 закодированы в ответе, потому что вы не можете хранить двоичные данные в XML. Это также объясняет, почему вы получаете больший буфер на клиенте, чем фактический PDF-файл, отправленный сервером.

Это, конечно же, будет зависеть от того, что связывает вашу службу WCF и как она настроена. Когда вы выгружаете содержимое MemoryStream, вы читаете на клиенте, что именно вы видите? Это должно дать вам дополнительные советы о том, как фактический файл PDF закодирован в теле ответа HTTP.

+0

Спасибо, это имеет смысл Дарин. В настоящее время у меня нет доступа к коду, но могу сказать, что исходный файл, отправленный из службы, был 20 МБ, но когда я выгружаю поток в файл на диске на стороне клиента, результирующий размер файла ~ 70MB. Может ли конверт действительно добавить такой размер в файл? Если это проблема, как я могу извлечь только необработанные байты и игнорировать неотправленные части возвращаемого потока? – DotNetDeveloper

+0

@DotNetDeveloper, я не могу ответить на этот вопрос, прежде чем вы расскажете больше о точном привязке этой службы или, по крайней мере, сбросе фактического ответа. Но, да, это в значительной степени похоже на конверт, содержащий байты с кодировкой Base64 файла PDF. –

+0

Привет Дарин и Раджеш. Извинения за задержку ответа. Изучив это более подробно, я обнаружил, что служба WCF была настроена для возврата ответов в json по умолчанию. Это объясняет, почему возвращаемый ответ был таким большим, это был массив байтов, сериализованный в большой строке json. Таким образом, кажется, вы были правы Дарина, в том смысле, что служба обертывала необработанные байты в какой-то формат ... – DotNetDeveloper

Смежные вопросы