svcutil не создает файл конфигурации

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

svcutil http://localhost/WcfService2/Files.svc

Я получил действительный файл с прокси, но не получил файл конфигурации. Почему? (VS2010 SP1, .NET 4.0, IIS 7.0)

Мой сервисный контракт:

[ServiceContract]
public interface IFiles
{
    [OperationContract]
    Guid UploadFile(Stream stream);
}

Моя веб-конфигурация:

<?xml version="1.0"?>
<configuration>

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="WebHttpBinding" maxBufferSize="65536" maxBufferPoolSize="524288"
          maxReceivedMessageSize="1073741824" transferMode="Streamed" />
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="MyServiceBehavior" name="WcfService2.Files">
        <endpoint behaviorConfiguration="WebHttpBehavior" binding="webHttpBinding"
          bindingConfiguration="WebHttpBinding" name="Files" contract="WcfService2.IFiles" />
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WebHttpBehavior">
          <webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Json"
            automaticFormatSelectionEnabled="false" />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.web>
    <httpRuntime maxRequestLength="100000" />
  </system.web>

</configuration>

person vpp    schedule 08.07.2011    source источник


Ответы (1)


Конечные точки, которые используют WebHttpBinding (также известные как конечные точки WCF WebHttp), не предоставляют метаданные, как это делают «обычные» (т. е. SOAP) конечные точки. WCF по-прежнему будет генерировать WSDL для вашей службы (поскольку вы указали <serviceMetadata httpGetEnabled="true"/>), но метаданные будут содержать только определенные аспекты службы (например, контракты данных и т. д.). Веб-функции (атрибуты WebInvoke/WebGet) не будут находиться на прокси-сервере, поэтому, даже если вы получите прокси-файл, вы, скорее всего, не сможете использовать его для связи со службой (если вы не не использовать ни один из них). Проблема в том, что не существует общепринятого формата для описания метаданных для служб REST (WADL, возможно, является наиболее используемым, но он не так распространен, как WSDL для SOAP, и не реализован WCF).

Вкратце: svcutil на самом деле не работает для веб-конечных точек.

Если вам нужна длинная версия: http://blogs.msdn.com/b/carlosfigueira/archive/2012/03/26/mixing-add-service-reference-and-wcf-web-http-aka-rest-endpoint-does-not-work.aspx

person carlosfigueira    schedule 08.07.2011
comment
Это неправда. Попробовал сделать простой проект дома (под VS2008, .NET 3.5). Конечная точка службы была настроена с помощью webHttpBinding и элемента поведения webHttp. Команда svcutil.exe localhost:3065/Service1.svc?wsdl получила и прокси, и конфигурацию файл. - person vpp; 09.07.2011
comment
Проверьте привязку, которая используется в файле конфигурации — это не будет webHttpBinding. Вы, вероятно, попадаете в какую-то конечную точку по умолчанию в службе. - person carlosfigueira; 09.07.2011
comment
Служба имеет только одну конечную точку. svcutil создает базу для клиента, который имеет доступ к конечной точке через SOAP (messageVersion=Soap12 из textMessageEncoding из customBinding). И это описано в конфигурационном файле. В первом образце его вообще не было. - person vpp; 10.07.2011
comment
То, что создал svcutil, не является привязкой, эквивалентной webHttpBinding (webHttpBinding не имеет версии SOAP, эквивалентной messageVersion.None). svcutil создает конфигурацию клиента для другой конечной точки, которая существует в службе, а не для одной конечной точки с поведением webHttpBinding/webHttp. Конечные точки WebHttpBinding не отображаются в WSDL/метаданных, которые использует svcutil. - person carlosfigueira; 10.07.2011
comment
Ясно. Не у каждого WCF-сервиса есть метаданные, чтобы сделать клиент под ключ. Спасибо, Карлосфигейра. - person vpp; 11.07.2011
comment
@carlosfigueira, если svcutil не может создать .config, как мне проверить app.config, чтобы он мог найти конечную точку wcf ?? ошибка, которую я получаю: не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт..... с уважением - person Guillermo Varini; 09.02.2012
comment
Была такая же проблема. это помогло решить эту проблему: msdn.microsoft.com/en-us/library/ ms734663.aspx - person Yuval A.; 16.04.2012