2015-03-26 4 views
0

Я конвертирую устаревший веб-сервис в службу WCF. Эта служба в настоящее время используется приложением переднего плана. Но на данный момент передняя часть намерена потреблять новую услугу WCF, поэтому вместо этого мы планируем перенаправить запрос на наш новый сервис из IIS. Улов здесь заключается в том, что новая служба WCF должна быть способна обрабатывать старый запрос ввода и должна иметь возможность отправлять ответ в том же формате.WCF Soap Response - удалить узел «Результат» (формат ответа WCF)

У меня не было проблем с обработкой запроса ввода, но я столкнулся с проблемами, пытающимися вернуть сообщение в старом формате. Моя текущая служба возвращается SoapResponse ниже в формате (я ноут, используя любые сообщения контракты/DataContracts, как я использую один и тот же тип возвращаемого значения & Входной параметр, используемый в старом унаследованного кода):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <UserCheckResponse xmlns="Abc.SomeNamespace"> 
    <UserCheckResult a:Direction="Response" a:Purpose="UserCheck" xmlns:a="Abc.SomeNamespace"> 
     <a:KV a:Key="TraceID" a:Value="546546565" /> 
     <a:KV a:Key="Response" a:Value="78954" /> 
     <a:KV a:Key="UserVerified" a:Value="N" /> 
     <a:KV a:Key="TryAgain" a:Value="Y" /> 
     <a:KV a:Key="DataSource" a:Value="NA" /> 
    </UserCheckResult> 
    </UserCheckResponse> 

Я хочу, чтобы это выглядело, как показано ниже (я не хочу узел UserCheckResult в ответ вместо я хочу ключевые пары значений непосредственно под UserCheckResponse узла):

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <UserCheckResponse a:Direction="Response" a:Purpose="UserCheck" xmlns:a="Abc.SomeNamespace"> 
     <a:KV a:Key="TraceID" a:Value="546546565" /> 
     <a:KV a:Key="Response" a:Value="78954" /> 
     <a:KV a:Key="UserVerified" a:Value="N" /> 
     <a:KV a:Key="TryAgain" a:Value="Y" /> 
     <a:KV a:Key="DataSource" a:Value="NA" /> 
    </UserCheckResponse> 

ответ

2

Я бы сказал, используя XMLSerialize вместо DataContractSerializer (по умолчанию для WCF). Добавьте «[System.ServiceModel.XmlSerializerFormatAttribute()]» для ваших операций. Затем используйте XmlElementAttribute для вашего узла ответа. Когда я не занят, я дам образец. Потому что я в настоящее время работаю над тем, чтобы использовать унаследованный вызов веб-службы и использовать устаревший запрос для вызова службы WCF для ответа на предыдущий ответ.

+0

Я действительно разрешил это, изменив формат ответа с помощью Message Inspectors, прежде чем отправить его обратно на передний конец. Но лучший способ сделать это - использовать контракты с сообщениями. Я не смог определить контракты с сообщениями, так как параметры моего метода являются устаревшими типами, и есть много сложных зависимостей. –