Проблема с файлом потоковой передачи WCF

Можно ли передать файл с помощью WCF с помощью MessageContract, который содержит другой MessageContract, внутри которого находится Stream? Я думаю, что ответ отрицательный, но я бы предпочел упаковать свой файл, так сказать, в сообщение «Root».

Другими словами, моя установка такова:

[MessageContract]
public class Transport
{
    [MessageHeader]
    private readonly Guid fId;

    [MessageHeader]
    private readonly DateTime fTimestamp;

    [MessageBodyMember(Order = 1)]
    public FileTransferMessage FileTransferMessage { get; set; }
}

[MessageContract]
public class FileTransferMessage : IDisposable
{
    [MessageBodyMember(Order = 1)]
    public Stream FileByteStream;

    [MessageHeader(MustUnderstand = true)]
    public long FileLength;

    [MessageHeader(MustUnderstand = true)]
    public string FileName;
}

Запрос отправляется и принимается в службу нормально, однако похоже, что поток не десериализуется должным образом и возвращается как пустая ссылка. Я знаю, что где-то читал правило, в котором говорится в MessageContract с Streaming, что Stream ДОЛЖЕН быть телом MessageContract, и я думаю, что это то, что сейчас нарушается. Я надеялся, что FileTransferMessage, являющийся телом, а затем Stream, являющийся телом, будет приемлемым.

У кого-нибудь есть предложения о том, что я могу здесь сделать? Я бы предпочел НЕ добавлять Stream / FileName / FileLength к моему транспортному объекту.


person Tada    schedule 09.10.2012    source источник


Ответы (1)


Как человек, который был частью команды, разрабатывающей MessageContract, я могу сказать вам, что ответ отрицательный :) MessageContract представляет ровно одно полное сообщение SOAP, вы не можете вкладывать их друг в друга (FileTransferMessage в вашем примере просто передается сериализатор, который ничего не знает об атрибуте [MessageContract] и игнорирует его, и ничего не знает о каком-либо особом поведении Stream).

Если не считать создания настраиваемого подкласса сообщений (или даже настраиваемого подкласса Stream), я не могу придумать хорошего решения. Если fId и fTimestamp присутствуют в каждом сообщении, рассмотрите возможность использования специального инспектора сообщений для их внедрения, а затем просто используйте FileTransferMessage в своей операции.

Официальные документы здесь: http://msdn.microsoft.com/en-us/library/ms730255.aspx и http://msdn.microsoft.com/en-us/library/ms733742.aspx

person Eugene Osovetsky    schedule 09.10.2012
comment
Спасибо, Евгений. Я решил, что позволю Stream быть в основном MessageContract, и мне просто нужно будет указать его в документации приложения, чтобы объяснить почему. - person Tada; 11.10.2012