правильная заглушка на стороне сервера службы WCF из WSDL - PullRequest
0 голосов
/ 11 сентября 2010

У меня есть следующий WSDL

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:tns="${namespace}" xmlns:wsr="http://www.openuri.org/2002/10/soap/reliability/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap12enc="http://www.w3.org/2003/05/soap-encoding" xmlns:conv="http://www.openuri.org/2002/04/wsdl/conversation/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="${namespace}">
 <message name="addADetails">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string0">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string1">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string2">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string3">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:int" name="intVal">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string4">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string5">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string6">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string7">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string8">
  </part>
 </message>
 <message name="addADetailsResponse">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="result">
  </part>
 </message>
 <message name="addBDetails">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string0">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string1">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string2">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string3">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string4">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string5">
  </part>
 </message>
 <message name="addBDetailsResponse">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="result">
  </part>
 </message>
 <message name="deleteCDetails">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string0">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string1">
  </part>
 </message>
 <message name="deleteCDetailsResponse">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="result">
  </part>
 </message>
 <message name="queryDDetails">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string0">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string1">
  </part>
 </message>
 <message name="queryDDetailsResponse">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="result">
  </part>
 </message>
 <message name="queryEDetails">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string0">
  </part>
 </message>
 <message name="queryEDetailsResponse">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="result">
  </part>
 </message>
 <message name="updateFDetails">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string0">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string1">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string2">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string3">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:int" name="intVal">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string4">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string5">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string6">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string7">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string8">
  </part>
 </message>
 <message name="updateFDetailsResponse">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="result">
  </part>
 </message>
 <message name="updateGDetails">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string0">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string1">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string2">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string3">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string4">
  </part>
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="string5">
  </part>
 </message>
 <message name="updateGDetailsResponse">
  <part xmlns:partns="http://www.w3.org/2001/XMLSchema" type="partns:string" name="result">
  </part>
 </message>
 <portType name="TestServicePort">
  <operation name="addADetails">
   <input message="tns:addADetails">
   </input>
   <output message="tns:addADetailsResponse">
   </output>
  </operation>
  <operation name="addBDetails">
   <input message="tns:addBDetails">
   </input>
   <output message="tns:addBDetailsResponse">
   </output>
  </operation>
  <operation name="deleteCDetails">
   <input message="tns:deleteCDetails">
   </input>
   <output message="tns:deleteCDetailsResponse">
   </output>
  </operation>
  <operation name="queryDDetails">
   <input message="tns:queryDDetails">
   </input>
   <output message="tns:queryDDetailsResponse">
   </output>
  </operation>
  <operation name="queryEDetails">
   <input message="tns:queryEDetails">
   </input>
   <output message="tns:queryEDetailsResponse">
   </output>
  </operation>
  <operation name="updateFDetails">
   <input message="tns:updateFDetails">
   </input>
   <output message="tns:updateFDetailsResponse">
   </output>
  </operation>
  <operation name="updateGDetails">
   <input message="tns:updateGDetails">
   </input>
   <output message="tns:updateGDetailsResponse">
   </output>
  </operation>
 </portType>
 <binding type="tns:TestServicePort" name="TestServicePort">
   <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
  <operation name="addADetails">
    <soap:operation style="rpc" soapAction=""/>
   <input>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </input>
   <output>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </output>
  </operation>
  <operation name="addBDetails">
    <soap:operation style="rpc" soapAction=""/>
   <input>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </input>
   <output>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </output>
  </operation>
  <operation name="deleteCDetails">
    <soap:operation style="rpc" soapAction=""/>
   <input>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </input>
   <output>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </output>
  </operation>
  <operation name="queryDDetails">
    <soap:operation style="rpc" soapAction=""/>
   <input>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </input>
   <output>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </output>
  </operation>
  <operation name="queryEDetails">
    <soap:operation style="rpc" soapAction=""/>
   <input>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </input>
   <output>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </output>
  </operation>
  <operation name="updateFDetails">
    <soap:operation style="rpc" soapAction=""/>
   <input>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </input>
   <output>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </output>
  </operation>
  <operation name="updateGDetails">
    <soap:operation style="rpc" soapAction=""/>
   <input>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </input>
   <output>
     <soap:body namespace="${namespace}" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" use="encoded"/>
   </output>
  </operation>
 </binding>
 <service name="TestService">
  <port name="TestServicePort" binding="tns:TestServicePort">
    <soap:address location="http://testserver:7001/test/TestService"/>
  </port>
 </service>
</definitions>

У меня есть прокси-класс, который вызывает веб-сервис, описанный WSDL. Мне нужно создать новый сервис WCF, который можно вызывать с тем же прокси-классом. Я использовал первый инструмент контракта WSCF.blue для веб-сервисов ThinkTecture, чтобы создать заглушку на стороне службы WCF:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(Namespace="${namespace}", ConfigurationName="ITestServicePort")]
public interface ITestServicePort
{

    [System.ServiceModel.OperationContractAttribute(Action="${namespace}/ITestServicePort/addADetails", ReplyAction="${namespace}/ITestServicePort/addADetailsResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="result")]
    string addADetails(string @string, string string0, string string1, string string2, string string3, int intVal, string string4, string string5, string string6, string string7, string string8);

    [System.ServiceModel.OperationContractAttribute(Action="${namespace}/ITestServicePort/addBDetails", ReplyAction="${namespace}/ITestServicePort/addBDetailsResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="result")]
    string addBDetails(string @string, string string0, string string1, string string2, string string3, string string4, string string5);

    [System.ServiceModel.OperationContractAttribute(Action="${namespace}/ITestServicePort/deleteCDetails", ReplyAction="${namespace}/ITestServicePort/deleteCDetailsResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="result")]
    string deleteCDetails(string @string, string string0, string string1);

    [System.ServiceModel.OperationContractAttribute(Action="${namespace}/ITestServicePort/queryDDetails", ReplyAction="${namespace}/ITestServicePort/queryDDetailsResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="result")]
    string queryDDetails(string @string, string string0, string string1);

    [System.ServiceModel.OperationContractAttribute(Action="${namespace}/ITestServicePort/queryEDetails", ReplyAction="${namespace}/ITestServicePort/queryEDetailsResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="result")]
    string queryEDetails(string @string, string string0);

    [System.ServiceModel.OperationContractAttribute(Action="${namespace}/ITestServicePort/updateFDetails", ReplyAction="${namespace}/ITestServicePort/updateFDetailsResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="result")]
    string updateFDetails(string @string, string string0, string string1, string string2, string string3, int intVal, string string4, string string5, string string6, string string7, string string8);

    [System.ServiceModel.OperationContractAttribute(Action="${namespace}/ITestServicePort/updateGDetails", ReplyAction="${namespace}/ITestServicePort/updateGDetailsResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
    [return: System.ServiceModel.MessageParameterAttribute(Name="result")]
    string updateGDetails(string @string, string string0, string string1, string string2, string string3, string string4, string string5);
}

Проблема в том, что когда я использую существующий прокси-класс для вызова моей новой службы, происходит сбой с SoapHeaderException:

Сообщение с действием '' не может быть обработано в приемнике, из-за Несоответствие ContractFilter в EndpointDispatcher. Это может быть из-за несоответствия контракта (несоответствующие действия между отправителем и получатель) или привязка / безопасность несоответствие между отправителем и получатель. Проверьте отправителя и получатель имеет тот же контракт и та же привязка (включая безопасность требования, например Сообщение, Транспорт, Нет).

Когда я заменяю один из членов Action в OperationContractAttribute на пустую строку, я могу успешно вызвать эту операцию. Когда я пытаюсь изменить несколько действий, чтобы очистить один и тот же вызов, происходит сбой со следующей ошибкой:

Клиент обнаружил тип содержимого ответа '', но ожидаемый 'text / xml'. запрос не выполнен с пустым ответом.

Кажется, что вы не можете выполнить более одной операции с пустым действием. Это верно? Как бы я решил эту проблему? Есть предложения?

Спасибо

1 Ответ

1 голос
/ 11 сентября 2010

Поведение по умолчанию в WCF использует действие SOAP, чтобы выбрать, какая операция должна обрабатывать входящий вызов.По этой причине параметры Action и ReplyAction в OparationContract должны быть уникальными для одного сервиса.

Вам необходимо направить ваш запрос по "телу". WCF samples содержит пример маршрутизации по элементу body.Используйте тот же подход, но вместо маршрутизации по элементу обертки верхнего уровня вам нужно будет решить, какая операция была вызвана на основе параметров, которые вы получаете.Служба, описанная WSDL, не использует элемент упаковки.

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