Поместите MessageContract как MessageBodyMember в другой контракт в WCF - PullRequest
1 голос
/ 26 октября 2011

Могу ли я использовать рекурсивный MessageContract в WCF?например:

Мне нужно опубликовать некоторые параметры, одним из параметров является массив файлового потока.это мой OperationContract:

DomainResult AddSomethingNew(int externalCustomerId, string domainName, bool isDefault, FileDataContract[] files);

вот мой MessageContract:

[MessageContract]
public class FileDataContract
{        
    [MessageHeader(MustUnderstand=true)]
    public int ExternalCustomerId { get; set; }

    [MessageHeader(MustUnderstand=true)]
    public string DomainName{get;set;}

    [MessageHeader(MustUnderstand=true)]
    public bool IsDefault{get;set;}

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

[MessageContract]
public class FileUploadInputParameter
{
    [MessageHeader(MustUnderstand = true)]
    public string FileName { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public decimal FileSize { get; set; }

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

нужна ваша помощь ..

Ответы [ 2 ]

3 голосов
/ 26 октября 2011

Вы можете использовать наследование, чтобы определить связь между двумя контрактами сообщений:

[MessageContract]
public class FileUploadInputParameter
{
    [MessageHeader(MustUnderstand = true)]
    public string FileName { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public decimal FileSize { get; set; }

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

[MessageContract]
public class FileDataContract : FileUploadInputParameter
{        
    [MessageHeader(MustUnderstand=true)]
    public int ExternalCustomerId { get; set; }

    [MessageHeader(MustUnderstand=true)]
    public string DomainName{get;set;}

    [MessageHeader(MustUnderstand=true)]
    public bool IsDefault{get;set;}
}

Вы не можете определить контракт сообщений, как вы описали в FileDataContract, потому что у вас не может быть массива заголовков сообщений, и более over Stream может бытьв большинстве случаев это единственный доступный элемент тела, и он должен быть только один.Поэтому, если вам нужно передать несколько файлов, вы также должны реализовать сжатие (zip) и отправить один поток.

1 голос
/ 26 октября 2011

Быстрый ответ: нет, вы не можете. Контракт сообщения - это определение SOAP-сообщения верхнего уровня, а не то, что может быть составлено. В вашем примере вы определяете элемент Files в теле, но некоторые его свойства (FileName, FileSize) должны быть в заголовке, что не соответствует. Если вы попытаетесь это сделать, это может даже «работать» таким образом, что вы не увидите никаких ошибок, а просто потому, что WCF будет рассматривать тип FileUploadInputParameter как сериализуемый тип POCO.

...