WCF - CODEGEN: создание контракта сообщения, так как сообщение FileRequest имеет заголовки - PullRequest
1 голос
/ 09 апреля 2010

Я знаю, что есть похожий вопрос здесь без решения.

Я работаю над потоковой службой WCF через HTTP.

Вот мои MessageContract

[MessageContract]
public class FileRequest
{
    #region Message Header

    [MessageHeader(MustUnderstand = true)]
    public Credential Credentials { get; set; }

    #endregion

    #region Message body

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

    #endregion

    #region Ctor

    // ...

    #endregion

}

[MessageContract]
public class FileRequestResponse
{
    #region Message Header

    [MessageHeader(MustUnderstand = true)]
    public FileInfo FileHeader { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public OperationResult<bool> OperationResult { get; set; }

    #endregion

    #region Message Body

    [MessageBodyMember]
    public Stream FileStream { get; set; }

    #endregion


    #region Constructor

    // ...

    #endregion

}

Вот мой ServiceContract

[ServiceContract(Namespace = "https://service.contract.example.com")]
public interface IUpdateService
{
    [OperationContract(Action = "GetUpdates")]
    OperationResult<List<FileInfo>> GetUpates(ApplicationInfo applicationInfo, Credential credential);

    [OperationContract(Action = "GetFile")]
    FileRequestResponse FileRequest(FileRequest fileRequest);
}

Теперь вопрос, почему я получаю эту ошибку:

// CODEGEN: создание сообщения контракт, так как сообщение FileRequest имеет Заголовки

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

public FileInfo FileRequest(Credential Credentials, FileInfo, out OperationResult<bool> OperationResult, out System.IO.Stream FileStream)

Примечание: Я не проверял «Всегда генерировать контракты сообщений» в справочнике услуг.

Ответы [ 2 ]

1 голос
/ 28 июля 2011

Установите [MessageContract(IsWrapped=true)] для всех сообщений, заключенных в службе, а затем попробуйте сгенерировать прокси.

0 голосов
/ 09 апреля 2010

Возможно, вы захотите использовать атрибут IsWrapped в сообщении:

[MessageContract(IsWrapped=false)]

Не уверен на 100%, какой из них вам нужен (true или false), но это один из вариантов, который вы можете попробовать.

Также еще одно наблюдение: я думаю, что немного рискованно иметь метод с именем FileRequest и контракт сообщений, который также называется FileRequest.

Общепринятым лучшим подходом было бы иметь метод GetFile, сообщение запроса для этого с именем GetFileRequest и тип сообщения ответа GetFileResponse. Не используйте одни и те же имена для разных вещей.

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