C # File.Open и Stream эквивалент - PullRequest
1 голос
/ 15 мая 2009

Этот веб-сервис ожидает этот XML-файл:

request.FeedContent = File.Open("test.xml", FileMode.Open, FileAccess.Read);

У меня уже есть файл в потоке, но этот оператор зависает:

stream.Position = 0;
request.FeedContent = stream;

поток является стандартным .net MemoryStream

какую операцию я делаю в потоке, чтобы сделать ее такой же как File.Open?

Спасибо !!

проверить это (определение API):

    /// <summary>
    /// Gets and sets the FeedContent property.
    /// </summary>
    //[XmlElementAttribute(ElementName = "FeedContent")]
    public Stream FeedContent
    {
        get { return this.feedContentField ; }
        set { this.feedContentField= value; }
    }

Ответы [ 5 ]

4 голосов
/ 16 мая 2009

Я сомневаюсь, что веб-сервис действительно ожидает поток. Как на земле это будет представлять это? Вы уверены, что он не просто ожидает содержимое в виде байтового массива?

File.Open просто возвращает FileStream - если stream уже является FileStream, то между ними нет никакой разницы. Просто возможно , что он хочет FileStream, тогда как вы только что получили Stream. Если это так, и это действительно , а не из файла, вам, возможно, придется записать его в файл и открыть для него FileStream. Затем пожаловайтесь разработчикам веб-сервисов, что их API странный.

РЕДАКТИРОВАТЬ: Если это только ожидание Stream, вы должны быть в порядке. Вы говорите, что он зависает - вы пытались отладить и посмотреть, где именно он висит? По какой-то причине он пытается прочитать больше данных?

1 голос
/ 16 мая 2009

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

Примерно так:

var stream = new MemoryStream(File.ReadAllBytes(fileName));
request.FeedContent = stream;

EDIT:

Подожди ... Я совершенно не понял твой вопрос. Таким образом, версия, в которой вы непосредственно передаете FileStream, работает, и если вы предоставляете MemoryStream с тем же содержимым, то это не так?

Теперь я бы предложил вам точно сравнить содержимое потока памяти с содержимым потока файлов. Возможно, другая кодировка?

1 голос
/ 16 мая 2009

Вы уверены, что текущая позиция в вашем потоке правильная?

Самая распространенная ошибка, которую я делаю при переходе от файлового потока к потоку памяти, - это пропустить ее после записи в поток памяти, в конце которой я нахожусь:

stream.Seek(0, SeekOrigin.Begin);
0 голосов
/ 16 мая 2009

File.Open возвращает FileStream, открытый и расположенный в начале потока.

Код, который вы разместили:

request.FeedContent = stream;

не указывает состояние потока, который вы назначаете для FeedContent. Например. может быть, вы не позиционированы в начале файла? (используйте Stream.Seek, если поток поддерживает поиск, что будет, если это FileStream или MemoryStream).

Опубликуйте больше кода, если это не поможет.

0 голосов
/ 16 мая 2009

File.Open возвращает поток. Проблема в другом.

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