Могу ли я использовать WCF wsHttpContextBinding с клиентами WSIT (Metro)?

Я работаю над проектом интеграции WCF - WSIT (Metro) и хотел бы разрешить клиентам Java подключаться к Durable Services.

Услуги длительного пользования http://msdn.microsoft.com/en-us/library/bb410767(v=vs.90).aspx

Для долговременных сервисов требуется wsHttpContextBinding, который, кажется, работает нормально. Единственная проблема заключается в том, что сгенерированный прокси WSIT-клиент не может назначить instanceId для мыльного конверта. Есть ли параметр конфигурации, о котором я не знаю, или, возможно, способ перехватить исходящие сообщения и добавить instanceId?

Следующий пример SOAP создается клиентом.NET. Единственное различие между отправкой WSIT с конвертами и этим заключается в том, что узел контекста отсутствует в WSIT:

      <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:r="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:a="http://www.w3.org/2005/08/addressing">
        <s:Header> 
...
          <Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">
            <Property name="instanceId">{I want to set this Id}</Property>
          </Context>
...
        </s:Header>
        <s:Body>
          <IncreaseCounter xmlns="http://tempuri.org/"/>
        </s:Body>
      </s:Envelope>

Я надеюсь, что это имеет смысл. Вопрос не связан с ws2007HttpBinding или wsHttpBinding или управлением экземпляром WCF; за / вызов, сессия, одиночная. Мне нужна помощь с WSIT, только Java.

2 ответа

Решение

Мой коллега, который работает над Java-проектом, помог выяснить синтаксис. Я разделяю решение, потому что оно может быть полезным для других. Значение этого поста состоит в том, что ни в документации WSIT не забыто упомянуть, что надежные службы WCF могут использоваться с клиентами Java. Надежный WCF необходим, если вам нужно написать Java-клиент, который может участвовать в длительных рабочих процессах, или клиент размещенного рабочего процесса Windows (WF).

Следующий код Java возвращает соответствующий заголовок:

private static Header getContextHeader(IDemoService port) {
    Header contextHeader = null;

    Iterator<Header> iterator = ((WSBindingProvider)port).getInboundHeaders().iterator();

    while(iterator. hasNext()){        
        Header header = iterator.next();

        if (header.getLocalPart().equalsIgnoreCase("Context")) {
            contextHeader = header;
        }

    }

    return contextHeader;
}

Затем вы можете установить контекст следующим образом:

Header contextHeader = getContextHeader(port);  
((WSBindingProvider)port).setOutboundHeaders(contextHeader); 

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

  • За звонок
  • За сеанс
  • не замужем

Похоже, вам нужен сеанс.

http://www.dotnetfunda.com/articles/article912-3-ways-to-do-wcf-instance-management-per-call-per-session-and-single-.aspx

Другие вопросы по тегам