Метаданные WCF содержат ссылку, которая не может быть разрешена - PullRequest
11 голосов
/ 11 января 2011

Я потратил пару часов на поиски этой ошибки и проверил почти все, что есть в Google.

Я хочу получить доступ к службе, используя TCP, .NET4 и VS2010, в C #.

У меня очень маленький сервис:


namespace WcfService_using_callbacks_via_tcp
{
    [ServiceContract(CallbackContract = typeof(ICallback), SessionMode = SessionMode.Required)]
    public interface IService1
    {
        [OperationContract]
        string Test(int value);
    }

    public interface ICallback
    {
        [OperationContract(IsOneWay = true)]
        void ServerToClient(string sms);
    }
    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    public class Service1 : IService1
    {
        public string Test(int value)
        {
            ICallback the_callback = OperationContext.Current.GetCallbackChannel<ICallback>();
            the_callback.ServerToClient("Callback from server, waiting 1s to return value.");
            Thread.Sleep(1000);
            return string.Format("You entered: {0}", value);
        }

    }
}

С этим Web.config:


<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <services>
      <service name="WcfService_using_callbacks_via_tcp.Service1" behaviorConfiguration="Behaviour_Service1">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost:5050/Service1" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="netTcpBinding" bindingConfiguration="DuplexNetTcpBinding_IService1" contract="WcfService_using_callbacks_via_tcp.IService1"/>
        <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="mexTcp" contract="IMetadataExchange"/>
      </service>
    </services>

    <bindings>
      <!--
        TCP Binding
      -->
      <netTcpBinding>
        <binding name="DuplexNetTcpBinding_IService1" sendTimeout="00:00:01"
                 portSharingEnabled="true">

        </binding>

        <binding name="mexTcp" portSharingEnabled="true">
          <security mode="None" />
        </binding>
      </netTcpBinding>


    </bindings>

    <behaviors>
      <serviceBehaviors>
        <!--
          Behaviour to avoid a rush of clients and to expose metadata over tcp
        -->
        <behavior name="Behaviour_Service1">
          <serviceThrottling maxConcurrentSessions="10000"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>

        <behavior>
          <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>

</configuration>

И этот код для его размещения:


static void Main(string[] args)
{
    Uri base_address = new Uri("net.tcp://localhost:5050/Service1");
    ServiceHost host = null;
    try
    {
        // Create the server
        host = new ServiceHost(typeof(Service1), base_address);
        // Start the server
        host.Open();
        // Notify it
        Console.WriteLine("The service is ready at {0}", base_address);
        // Allow close the server
        Console.WriteLine("Press <Enter> to stop the service.");
        Console.ReadLine();
        // Close it
        host.Close();
    }
    catch (Exception ex)
    {
        // Opus an error occurred
        Console.ForegroundColor = ConsoleColor.Red;
        Console.WriteLine(string.Format("Host error:\r\n{0}:\r\n{1}", ex.GetType(), ex.Message));
        Console.ReadLine();
    }finally
    {
        // Correct memory clean
        if(host != null)
            ((IDisposable)host).Dispose();
    }
}

Теперь я хочу создать клиента, но мне это не представляется возможным. Я использовал Add Service Reference и svcutil напрямую, но получаю эту ошибку:


C: \ Program Files (x86) \ Microsoft Visual Studio 10.0 \ VC> svcutil.exe net.tcp: // loc alhost: 5050 / Service1 Модель обслуживания Microsoft (R) Инструмент метаданных [Microsoft (R) Windows (R) Communication Foundation, Версия 4.0.30319.1] Авторское право (c) Microsoft Corporation. Все права зарезервирован.

Попытка загрузки метаданных из 'net.tcp: // localhost: 5050 / Service1' с использованием W S-метаданных Exchange. это URL не поддерживает DISCO. Инструмент метаданных сервисной модели Microsoft (R) [Microsoft (R) Windows (R) Communication Foundation, версия 4.0.30319.1] Авторское право (c) Microsoft Corporation. Все права защищены.

Ошибка: невозможно получить метаданные из net.tcp: // localhost: 5050 / Service1

Если это служба Windows (R) Communication Foundation, к которой вы есть доступ, проверьте, что вы включили публикацию метаданных по указанному адресу. Для получения помощи по включению публикации метаданных, пожалуйста, обратитесь к документу MSDN по адресу http://go.microsoft.com/fwlink/?LinkId=65455.

Ошибка обмена метаданными WS URI: net.tcp: // localhost: 5050 / Service1

Метаданные содержат ссылку, которая не может быть разрешена: 'net.tcp: // localhost: 5050 / Service1'.

Соединение с сокетом было прервано. Это может быть вызвано ошибкой при обработке вашего сообщения или превышением времени ожидания приема удаленный хост или проблема с сетевым ресурсом. Местный таймаут сокета был '00: 04: 59.9863281 '.

Запрет на временное прекращение существования в настоящее время.

Если вам нужна дополнительная помощь, введите "svcutil /?"


Итак, я могу разместить службу без проблем, но не могу создать прокси.

Я перепробовал почти любой найденный конфиг, но я думаю, что текущий файл web.config правильный. Есть поведения, безопасность и привязки, использующие mex, используемые конечными точками.

Я попытался создать файл app.config и установить его в той же папке с svcutil.exe.

Ответы [ 6 ]

8 голосов
/ 11 января 2011

Вам не хватает конфигурации службы

<system.serviceModel>
  <services>
    <service name="WcfService_using_callbacks_via_tcp.Service1" 
      behaviorConfiguration="Behavior_Service1">
      <host>
        <baseAddresses>
          <add baseAddress="net.tcp://localhost:5050/Service1" />
        </baseAddresses>
      </host>
      <endpoint address="" contract="WcfService_using_callbacks_via_tcp.IService1"
         binding="netTcpBinding" bindingConfiguration="DuplexNetTcpBinding_IService1" />
      <endpoint address="mex" contract="IMetadataExchange" binding="mexTcpBindng" />
    </service>
  </services>
  ...
</system.serviceModel>

С этой конфигурацией вам не нужно определять базовый адрес в коде.

3 голосов
/ 11 января 2017

Я получил ту же ошибку при попытке обновить существующую ссылку на сервис. Оказывается, у меня были контракты данных с тем же именем в одном и том же пространстве имен. Дальнейшее расследование дало настоящую ошибку:

DataContract для типа [отредактировано] нельзя добавить в DataContractSet, поскольку тип ' [отредактировано] ' с тем же именем контракта данных 'DocumentInfo' в пространстве имен ' [отредактировано ] 'уже присутствует и контракты не эквивалентны.

Я изменил DataContract, чтобы предоставить имя для одного из классов.

[DataContract(Namespace = "urn:*[redacted]*:DataContracts", Name = "SC_DocumentInfo")]

Я публикую это здесь на случай, если это может помочь кому-то с такой же проблемой.

2 голосов
/ 28 июня 2016

Я получаю то же сообщение об ошибке, и, как оказалось, проблема связана с текстом в блоке комментариев

<!-- comments included characters like à, ç and ã -->

После удаления таких символов из блока с комментариями все работает нормально

1 голос
/ 08 августа 2017

Может быть, это кому-нибудь пригодится.

Моя проблема была в аргументе договора, и я обнаружил ее с помощью Просмотр событий :

Операция [ Имя метода ] имеет либо параметр, либо тип возврата, который приписывается MessageContractAttribute.Чтобы представить сообщение запроса с помощью Контракта на сообщение, операция должна иметь единственный параметр , связанный с MessageContractAttribute.Чтобы представить ответное сообщение с помощью Контракта на сообщение, возвращаемое значение операции должно быть типом, который приписан MessageContractAttribute, и операция не может иметь никаких параметров out или ref.

Итак, еслидобавив более одного аргумента, уже имея аргумент [MessageContract], вы увидите ошибку, о которой идет речь.Совершенно не очевидно.

1 голос
/ 13 сентября 2011

У меня была такая же проблема (когда клиент не «видел» службу в меню «Добавить ссылку на службу») при использовании только привязки tcp. После попытки добавить Поведение я закончил свое служение исключением, потому что не нашел правильный адрес. Я не знаю, является ли это лучшей идеей, но вы можете добавить второй базовый адрес как http .... вот мой конфиг и код, он работает.

    <?xml version="1.0" encoding="utf-8" ?><configuration>  <system.serviceModel>  <services>
  <service name="TestBindings.StockQuoteService">
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://10.62.60.62:34000/StockQuoteService" />
        <add baseAddress ="http://10.62.60.62:12000/StockQuoteService"/>
      </baseAddresses>
    </host>
    <endpoint address=""
    contract="TestBindings.IStockQuoteService"
    binding="netTcpBinding" />
  </service>
</services>

и код

  class Program
{
    static void Main(string[] args)
    {
        ServiceHost sh = new ServiceHost(typeof(StockQuoteService));
        ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
        behavior.HttpGetEnabled = true;
        sh.Description.Behaviors.Add(behavior);
        sh.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(),
            "mex");
        sh.Open();

Адрес http теперь используется клиентом для добавления ссылки на службу, и автоматически сгенерированный конфиг на стороне клиента использует протокол net.tcp для вызова функции.

0 голосов
/ 14 ноября 2018

Для вышеупомянутой проблемы проверьте файл reference.svc, который генерируется во время добавления ссылки.Упомянутый выше URL будет использоваться для обновления службы, чтобы вы могли проверить, работает она или нет.

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