Веб-служба WCF - Невозможно создать прокси-классы - PullRequest
1 голос
/ 04 октября 2010

Я пытаюсь создать веб-сервис с использованием WCF.Поскольку в конечном итоге служба будет использоваться не на языках .NET, я пытаюсь протестировать ее, используя «Добавить веб-ссылку» или WSDL.exe вместо svcutil.Я получаю следующие ошибки:

Из WSDL.exe - ошибка: невозможно импортировать привязку BasicHttpBinding_IEchoService из пространства имен http://tempuri.org. - - невозможно импортировать эхо операции.- - Элемент http://tempuri.org/:Echo отсутствует.

Из справочника добавления службы и справки веб-добавления: метаданные содержат ссылку, которую невозможно разрешить: ссылка на wsdl .Документ WSDL содержит ссылки, которые не могут быть разрешены.Произошла ошибка при загрузке http://localhost:8080/EchoService.svc?xsd=xsd0 Основное соединение было закрыто.

Этот упрощенный пример имеет ту же проблему, что и основная служба.

Вот Web.Config службы:

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="EchoBehaviorConfiguration">
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <services>
      <service name="EchoService">
        <endpoint address="" 
                  behaviorConfiguration="EchoBehaviorConfiguration" 
                  binding="basicHttpBinding" 
                  contract="IEchoService" />
        <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpBinding" />

      </service>
    </services>
    <bindings>
      <basicHttpBinding>
      </basicHttpBinding>
      <mexHttpBinding></mexHttpBinding>
    </bindings>
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

Вот контракт / интерфейс:

[ServiceContract]
public interface IEchoService
{
    [OperationContract]
    string Echo(string message);
}

А вот WSDL, который генерируется:

<wsdl:definitions name="EchoService" targetNamespace="http://tempuri.org/">
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://localhost:8080/EchoService.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://localhost:8080/EchoService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IEchoService_Echo_InputMessage">
<wsdl:part name="parameters" element="tns:Echo"/>
</wsdl:message>
<wsdl:message name="IEchoService_Echo_OutputMessage">
<wsdl:part name="parameters" element="tns:EchoResponse"/>
</wsdl:message>
<wsdl:portType name="IEchoService">
<wsdl:operation name="Echo">
<wsdl:input wsaw:Action="http://tempuri.org/IEchoService/Echo" message="tns:IEchoService_Echo_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IEchoService/EchoResponse" message="tns:IEchoService_Echo_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BasicHttpBinding_IEchoService" type="tns:IEchoService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Echo">
<soap:operation soapAction="http://tempuri.org/IEchoService/Echo" 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="EchoService">
<wsdl:port name="BasicHttpBinding_IEchoService" binding="tns:BasicHttpBinding_IEchoService">
<soap:address location="http://localhost:8080/EchoService.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

Служба в настоящее время размещается локально через IIS7.Я попытался и HTTP и HTTPS и имею ту же самую проблему.Если я попытаюсь изменить привязку с basicHttpBinding на webHttpBinding, в WSDL ничего не изменится.

Есть идеи, где я ошибаюсь?

ОБНОВЛЕНИЕ: У меня сейчас настроена конфигурация, что еслислужба работает под управлением Cassini вместо IIS, я могу добавить ссылку на службу или веб-страницу в мой тестовый проект.Я не могу сохранить wsdl и использовать WSDL.exe для генерации прокси-классов.

Так что теперь у меня есть 3 проблемы:

  1. Кромеделает aspnet_regiis для установки и регистрации WCF 4 в IIS. Могу ли я что-нибудь еще сделать?

  2. Есть идеи, что мне нужно сделать, чтобы заставить его работать с WSDL.exe?

  3. После выполнения службы ASMX и сравнения сгенерированных WSDL они существенно отличаются, что заставляет меня задуматься о том, насколько совместима WCF на данном этапе с языками, отличными от .NET.

Ответы [ 3 ]

3 голосов
/ 31 августа 2011

У меня та же проблема из-за? Xsd = xsd0, используемого в WSDL.Я нашел эту ссылку, которая дает это решение:

  • Когда вы задействуете свое оружие (Process Monitor) в процессе csc.exe (это компилятор, генерирующий xsd), вы поймете, что идентификатор IISIIS_WPG не имеет доступа к папке Windows \ Temp.Дайте достаточно прав на папку и альт проблема решена.

http://merill.net/2008/04/wcf-add-service-reference-gotcha-with-windows-server/

1 голос
/ 04 октября 2010

Похоже, вы не указали имя поведения в правильном месте

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.aspx

В результате httpGet не поддерживает метаданные.

0 голосов
/ 04 октября 2010

Учитывая ваш пример, я думаю, вы можете немного упростить свою конфигурацию.

Например, если у вас есть файл .svc, который выглядит в объявлении enpoint вашего wsdl, вы можете получить:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="false"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>

тогда вы сможете получить к нему доступ через URL http://localhost:8080/EchoService.svc (при условии, что он находится на локальной машине и прослушивает порт 8080. Просто подумайте, что Tomcat иногда использует 8080 в качестве порта по умолчанию .... )

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