При попытке сериализации параметра произошла ошибка - PullRequest
2 голосов
/ 03 мая 2011

У меня есть служба WCF, и я ищу поток файлов с сервера на клиент.

У меня это работало, когда я жестко кодировал имя файла файла для потоковой передачи в код.

Я пытаюсь изменить код, чтобы метод getStream возвращал словарь, чтобы я мог вернуть коллекцию имен файлов и поток, связанный с именем файла, а затем обработать каждый поток на стороне клиента.

Я получаю следующее исключение на стороне клиента при попытке вызвать метод getStream: Произошла ошибка при получении ответа HTTP на http://localhost:8082/. Это может быть связано с тем, что привязка конечной точки службы не использует протокол HTTP. Это также может быть связано с тем, что сервер прерывает контекст HTTP-запроса (возможно, из-за закрытия службы). Подробнее смотрите в журналах сервера.

После исследования этого в сети это выглядит как ложное исключение, поэтому я включил трассировку, и это сообщение об исключении из журнала трассировки:

Произошла ошибка при попытке сериализации параметра http://tempuri.org/:GetStreamResult. Сообщение InnerException было "Тип" System.IO.FileStream "с именем контракта данных" FileStream: http://schemas.datacontract.org/2004/07/System.IO' не ожидается. Рассмотрите возможность использования DataContractResolver или добавьте любые типы, которые не известны статически, в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив их в список известных типов, переданных в DataContractSerializer. '. Пожалуйста, смотрите InnerException для более подробной информации.

Вот код на стороне сервера:

public Dictionary<String, Stream> GetStream()
    {
        Dictionary<String, Stream> retDic = new Dictionary<string, Stream>();          

        string[] fileEntries = Directory.GetFiles(@"C:\Users\Ash\Desktop\FrontendPluginsServer");
        foreach (string fileName in fileEntries)
        {
             //do something with fileName
            retDic.Add(fileName, File.OpenRead(fileName));
        }
        //return File.OpenRead(@"C:\Users\Ash\Desktop\FrontendPluginsServer\OptekImporterFrontend.dll");

        return retDic;
    }

Вот код на стороне клиента:

ModuleDownloader.ModuleDownloaderClient moo = new ModuleDownloader.ModuleDownloaderClient();
        Dictionary<String, Stream> dic = moo.GetStream();

        foreach (String key in dic.Keys)
        {
            using (Stream file = File.OpenWrite(@"C:\Users\Ash\Desktop\FrontEndPluginsClient\" + key)) { CopyStream(dic[key], file); }
        }

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

С уважением

Ash

1 Ответ

6 голосов
/ 03 мая 2011

Нет способа сделать это.

  • FileStream не сериализуем. Причина, по которой он пытается сериализоваться, заключается в том, что он не следует соглашениям о потоковой передаче WCF.
  • Ограничения WCF для потоковой передачи определяют, что в сигнатуре метода должен быть один Stream и ничегоиначе, если вы хотите использовать потоковую передачу WCF.

В любое время вы можете отправить только один поток.

Подробнее здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...