Wcf как мыло: разные проблемы в зависимости от клиентов - PullRequest
1 голос
/ 19 октября 2011

Я разрабатываю простой сервис wcf и пытаюсь представить его как Soap по соображениям совместимости: клиент будет флэш-приложением со своим приятным сценарием действий.

Я, очевидно, использую basicHttpBinding для создания WSDL, совместимого с мылом.

Вот моя конфигурация (разумеется, анонимная из конфиденциальных данных):

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="soapBinding" />
  </basicHttpBinding>
</bindings>
<services>
  <service behaviorConfiguration="BasicBehavior" name="MyCustomer.MyProject.WebService.MyService">
    <endpoint address="mex" binding="mexHttpBinding" name="mex" contract="IMetadataExchange" />
    <endpoint binding="basicHttpBinding" bindingConfiguration="soapBinding"
      name="Basic" bindingNamespace="http://myurl"
      contract="MyCustomer.MyProject.WebService.IMyService">
    </endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="http://myurl" />
      </baseAddresses>
    </host>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="BasicBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Это действительно очень просто.Теперь парень, разрабатывающий приложение флэш, заявляет, что у него есть некоторые проблемы, что он видит единственный присутствующий метод (называемый ValidateForm), но он не видит список параметров.

Я попробовал следующее:

  • Вызов веб-службы с использованием шторма (storm.codeplex.com): осторожно: шторм, а не wcf storm.Storm работает только с обычными веб-сервисами, он не может подключиться в собственном режиме WCF.Это отлично работает.Я вижу параметры, могу их заполнить, вызвать и получить правильный ответ.
  • Вызов службы с помощью http://soapclient.com/soaptest.html: это читает мой wsdl, видит список параметров, но при вызове "неожиданной ошибки"
  • Вызов веб-службы с помощью http://www.validwsdl.com/: при этом читается wsdl, но он вообще не видит список параметров, и вызов не выполняется.

Естьочевидно, что-то не так с моим обслуживанием.Далее следует WSDL, может кто-нибудь подскажет, что не так (опять анонимно):

    <wsdl:definitions name="mycustomermyprojectService" targetNamespace="http://www1.myproject.mydomain.com" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://www1.myproject.mydomain.com" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
  <wsdl:types>
    <xsd:schema targetNamespace="http://www1.myproject.mydomain.com/Imports">
      <xsd:import schemaLocation="http://www1.myproject.mydomain.com/?xsd=xsd0" namespace="http://www1.myproject.mydomain.com"/>
      <xsd:import schemaLocation="http://www1.myproject.mydomain.com/?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
      <xsd:import schemaLocation="http://www1.myproject.mydomain.com/?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/mycustomer.myproject.WebService.Models"/>
    </xsd:schema>
  </wsdl:types>
  <wsdl:message name="ImycustomermyprojectService_ValidateForm_InputMessage">
    <wsdl:part name="parameters" element="tns:ValidateForm"/>
  </wsdl:message>
  <wsdl:message name="ImycustomermyprojectService_ValidateForm_OutputMessage">
    <wsdl:part name="parameters" element="tns:ValidateFormResponse"/>
  </wsdl:message>
  <wsdl:portType name="ImycustomermyprojectService">
    <wsdl:operation name="ValidateForm">
      <wsdl:input wsaw:Action="http://www1.myproject.mydomain.com/ImycustomermyprojectService/ValidateForm" message="tns:ImycustomermyprojectService_ValidateForm_InputMessage"/>
      <wsdl:output wsaw:Action="http://www1.myproject.mydomain.com/ImycustomermyprojectService/ValidateFormResponse" message="tns:ImycustomermyprojectService_ValidateForm_OutputMessage"/>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="Basic" type="tns:ImycustomermyprojectService">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="ValidateForm">
      <soap:operation soapAction="http://www1.myproject.mydomain.com/ImycustomermyprojectService/ValidateForm" style="document"/>
      <wsdl:input>
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="mycustomermyprojectService">
    <wsdl:port name="Basic" binding="tns:Basic">
      <soap:address location="http://www1.myproject.mydomain.com/"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Кто-нибудь может пролить свет?Спасибо.

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Существуют сценарии, когда другие платформы не понимают атрибутов импорта, и, следовательно, нам нужно сплющить наш wsdl.

Вы можете найти некоторую информацию о том, как сгладить ваш wsdl, по следующей ссылке

Вам необходимо создать собственную фабрику хостов службы, которая уплощает ваш wsdl, как описано вссылка на сайт.Это будет встроенная функция в .NET 4.5, если я не ошибаюсь.Информацию об этом можно найти по этой ссылке

0 голосов
/ 19 октября 2011

Нет никаких типов непосредственно в этом wsdl.Они импортируются из других мест (например, http://www1.myproject.mydomain.com/?xsd=xsd0) в объявлении xsd: import.Синтаксический анализатор должен будет следовать этим импортам и анализировать их.Я не знаю, делает ли validWSDL.com это.Я попробовал это на собственной службе, и при вызове произошла ошибка:

«Не найдено подходящего определения« элемента »в элементе документа WSDL»

Если у вас возникают проблемы с некоторыми клиентами, вы можете попытаться заменить импорт схемами, определенными в этих файлах напрямую.Посмотрите здесь, как выглядят идентификаторы элементов wsdl .Поскольку я еще не испытал этого, я не могу гарантировать, что это является причиной, но вы можете попробовать это с validwsdl.com и посмотреть, работает ли он.Должно быть легко проверить.

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