Могу ли я использовать WCF wsHttpContextBinding с клиентами WSIT (Metro)? - PullRequest
2 голосов
/ 24 марта 2011

Я работаю над проектом интеграции 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 ]

3 голосов
/ 08 апреля 2011

Мой коллега, который работает над 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); 
1 голос
/ 24 марта 2011

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

  • За вызов
  • За сеанс
  • Один

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

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

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