Пользовательские заголовки сообщений в WCF на Mono - PullRequest
0 голосов
/ 20 апреля 2010

Я делаю вызовы WCF из клиента Mono, работающего в Ubuntu (Mono 2.6).

Я не могу добавить свой заголовок к своим сообщениям. Я пробовал два разных способа:

  • Использование атрибутов [MessageContract] и [MessageHeader] в пользовательском классе
  • Добавление заголовка к исходящим сообщениям программным способом, например

    MessageHeader mhg = новый MessageHeader («тест»);
    MessageHeader untyped = mhg.GetUntypedHeader ("token", "ns");
    OperationContext.Current.OutgoingMessageHeaders.Add (нетипизированный);

Заголовок отсутствует, когда звонок достигает сервера! Это всегда ноль.

Обратите внимание, что оба метода отлично работают на .NET в Windows. Также обратите внимание, что тело сообщения прекрасно проходит через Mono.

Я вижу некоторые ссылки в Интернете, которые предполагают, что должно работать:

http://forums.monotouch.net/yaf_postsm1692.aspx
https://bugzilla.novell.com/show_bug.cgi?id=551745

Также - на странице состояния Mono показано, что все содержимое MessageHeader полностью реализовано ...

Кому-нибудь повезло с этим?

Заранее спасибо, Ричард

1 Ответ

1 голос
/ 05 мая 2010

Я борюсь с подобными проблемами.

Я решил проблему с клиентом и сервером C #. Предполагая, что вы правильно понимаете клиента, мой опыт может помочь:

Мой метод обслуживания выглядит следующим образом:

public FileUploadResult UploadFileSegment(FileUploadMessage uploadMessage)

И мой класс параметров метода обслуживания выглядит так:

 [MessageContract]
  public class FileUploadMessage
  {
    [MessageHeader(MustUnderstand = false, Name="Metadata", Namespace = "")]
    public FileUploadMetadata Metadata;

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

Обратите внимание на присвоения Name = и Namespace = внутри атрибута.

Когда я внедряю заголовки сообщений на стороне клиента, я также указываю имя и пространство имен. В C # это выглядит так:

using (OperationContextScope contextScope = new OperationContextScope(proxy.InnerChannel))
  {
    OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader("Metadata", "", uploadHeader));
    proxy.UploadFileSegmentAsync(uploadMessage);
  }

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

...