Могу ли я использовать 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 варианта:
- За звонок
- За сеанс
- не замужем
Похоже, вам нужен сеанс.