Не удалось добавить сервис. Метаданные службы могут быть недоступны. Убедитесь, что ваш сервис работает и предоставляет метаданные.

РЕДАКТИРОВАТЬ:

После того, как я изменил web.config и я не получаю ошибку, это хорошо.... тогда я добавляю новую страницу (html) и пишу этот небольшой код для использования сервиса следующим образом:

 $("#btn12").click(function (event) {
                $.getJSON('http://localhost:3576/MyService.svc/GetCurrentUser', {},
                function (data) {
                    alert(data);
                });
                //return false;
            });

Я вижу следующую ошибку в моем FireBug:

http://localhost:3576/MyService.svc/GetCurrentUser
400 Bad Request

Примечание: я добавил html-страницу в тот же проект wcf и сам запускаю проект, поэтому я предполагаю, что служба также работает...

Что здесь может быть не так?

КОНЕЦ РЕДАКТИРОВАНИЯ

Я только что создал новые службы wcf, и когда я нажимаю f5 из VS, и я получаю эту ошибку в окне тестового клиента WCF:

Не удалось добавить сервис. Метаданные службы могут быть недоступны. Убедитесь, что ваш сервис запущен и предоставляет метаданные.

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

Ошибка обмена метаданными WS
URI: http://localhost:3696/MyService.svc
Метаданные содержат ссылку, которая не может быть разрешена: " http://localhost:3696/MyService.svc".

На http://localhost:3696/MyService.svc не было прослушивания конечной точки, которая могла бы принять сообщение. Это часто вызвано неправильным адресом или действием SOAP. Смотрите InnerException, если имеется, для более подробной информации.

невозможно подключиться к удаленному серверу
Невозможно установить соединение, потому что целевая машина активно отказалась от него. 127.0.0.1:3696
Ошибка HTTP GET
URI: http://localhost:3696/MyService.svc
Произошла ошибка при загрузке " http://localhost:3696/MyService.svc".
невозможно подключиться к удаленному серверу
Невозможно установить соединение, потому что целевая машина активно отказалась от него. 127.0.0.1:3696

Мой конфиг:

<behaviors>
    <endpointBehaviors>
        <behavior name="MyService.MyService">
            <webHttp/>
        </behavior>
    </endpointBehaviors>
    <serviceBehaviors>
        <behavior name="metadataBehavior">
            <serviceMetadata httpGetEnabled="true" httpGetUrl="http://localhost:2812/MyService.svc" />
        </behavior>
    </serviceBehaviors>
</behaviors>
<services>
    <service name="MyService.MyService" 
             behaviorConfiguration="metadataBehavior">
        <endpoint 
            address="http://localhost/MyService.svc" 
            binding="customBinding"
            bindingConfiguration="jsonpBinding" 
            behaviorConfiguration="MyService.MyService"
            contract="MyService.IMyService"/>
    </service>
</services>
<bindings>
    <customBinding>
        <binding name="jsonpBinding">
            <jsonpMessageEncoding/>
            <httpTransport manualAddressing="true"/>
        </binding>
    </customBinding>
</bindings>
<extensions>
    <bindingElementExtensions>
        <add name="jsonpMessageEncoding" type="Microsoft.Ajax.Samples.JsonpBindingExtension, MyService, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
    </bindingElementExtensions>
</extensions>

18 ответов

Решение

Вам необходимо добавить конечную точку обмена метаданными (mex) к вашему сервису:

<services>
   <service name="MyService.MyService" behaviorConfiguration="metadataBehavior">
      <endpoint 
          address="http://localhost/MyService.svc" 
          binding="customBinding" bindingConfiguration="jsonpBinding" 
          behaviorConfiguration="MyService.MyService"
          contract="MyService.IMyService"/>
      <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
   </service>
</services>

Теперь вы должны иметь возможность получать метаданные для вашего сервиса

Обновление: хорошо, так что вы просто запускаете это из Visual Studio - в этом случае оно будет размещено на Cassini, встроенном веб-сервере. Этот зверь, однако, поддерживает только HTTP - вы не используете этот протокол в привязке...

Кроме того, поскольку вы размещаете это в Cassini, адрес вашего сервиса будет продиктован Cassini - вы ничего не можете определить.

Так что мое предложение будет:

  • попробуйте использовать http привязку (только сейчас для тестирования)
  • заставить это работать
  • как только вы узнаете, что это работает, измените его на свою привязку и разместите в IIS

Поэтому я бы изменил конфиг на:

<behaviors>
   <serviceBehaviors>
      <behavior name="metadataBehavior">
         <serviceMetadata httpGetEnabled="true" />
      </behavior>
   </serviceBehaviors>
</behaviors>
<services>
   <service name="MyService.MyService" behaviorConfiguration="metadataBehavior">
      <endpoint 
          address=""   <!-- don't put anything here - Cassini will determine address -->
          binding="basicHttpBinding" 
          contract="MyService.IMyService"/>
      <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
   </service>
</services>

Как только вы это сделаете, попробуйте сделать View in Browser в вашем SVC-файле в решении Visual Studio - если это не сработает, у вас все еще есть какая-то серьезная проблема.

Если это работает - теперь вы можете нажать F5 в VS, и ваша служба должна появиться, и, используя приложение WCF Test Client, вы сможете получить метаданные службы с а) адреса, с которого Cassini запустил вашу службу, или б) мекс адрес (адрес Кассини + /mex)

Если вы переименуете файл SVC, убедитесь, что ваша разметка верна. Вам не нужно изменять конфигурацию по умолчанию и выполнить следующие шаги: 1) Перейдите к файлу SVC правой кнопкой мыши и выберите просмотр разметки. 2) Убедитесь, что этот код и служба указывают на правильное имя файла и класса.

В моем случае я получал эту ошибку, потому что опция (HttpActivation) не была включена. Диалоговое окно функций Windows, показывающее активацию HTTP в службах WCF в.NET Framework 4.6 Advanced Services

К вашему сведению - вы также можете получить эту ошибку от машины, которой не хватает свободной памяти. Я получил эту ошибку на машине с 16 гигабайтами памяти. У меня была ВМ, работающая с 6 гигабайтами, и МНОГО приложений, интенсивно использующих память. Закройте немного, и эта проблема ушла.

Я все еще получил ошибку в названии вопроса

Не удалось добавить сервис. Метаданные службы могут быть недоступны. Убедитесь, что ваш сервис работает и предоставляет метаданные.

Я заметил более крупное сообщение о памяти, хотя и использовал тестовый клиент WCF.

Надеюсь, это поможет кому-то еще.

Добавлять Serializable() перед типом вы выставляете

Serializable()
Public Class YourType

Положил Serializable в <>

Изменение типа привязки с wsHttpbinding на привязку basichttp в теге конечной точки и с wsHttpbinding на mexhttpbinginding в теге конечной точки метаданных помогло устранить ошибку. Спасибо...

При работе со службой WCF.NET 4.0 - убедитесь, что Global.asax отсутствует в исходном каталоге. Если это так, он берется во время выполнения и пытается быть скомпилирован в...

Для меня проблема была решена следующим образом:

Перешел в Инструмент -> Параметры -> Проект и решения -> Веб-проекты.

Я обнаружил, что первый флажок «Использовать 64-разрядную версию IIS Express для веб-сайтов и проектов» был снят.

Установка этого флажка помогла мне запустить клиент WCF.

Версия VS: VS2019

В моем случае, закомментировав

<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 

В файле web.config выдается сообщение "Не удалось добавить службу. Метаданные службы могут быть недоступны. Убедитесь, что служба запущена и предоставляет метаданные".

Недвижимость IsOneWay=true может быть верным в Операционном контракте интерфейса. Удалите это свойство, чтобы избавиться от этой ошибки.

Я заметил, что когда я удалил SessionMode из атрибута ServiceContract, проблема исчезла.

Пример:

[ServiceContract(SessionMode=SessionMode.Required, CallbackContract=typeof(ICallbacks))]
 public interface IStringReverser
 {
   [OperationContract]
   string ReverseString(string value);
 }

чтобы...

[ServiceContract()]
 public interface IStringReverser
 {
   [OperationContract]
   string ReverseString(string value);
 }

В моем случае веб-сервис создавал сборку с именем, отличным от имени проекта / службы. Это было установлено моим предшественником, разработчиком, работающим над решением, и я не знал.

Было установлено -

  <serviceBehaviors>
    <behavior name="CustomServiceBehavior">
      <serviceAuthorization serviceAuthorizationManagerType="BookingService.KeyAuthorizationManager, BookingService" />
     </behavior>
 </serviceBehaviors>

Итак, исправление заключалось в том, что в serviceAuthorizationManagerType было указано правильное имя сборки. Имя сборки можно получить по следующему пути к сервисному проекту: Щелкните правой кнопкой мыши проект WCF svc -> Выберите "Свойства" -> В списке вкладок выберите "Приложение". Сравните значение с полем "Название сборки:" в списке. Это AssemblyName, которое следует использовать для serviceAuthorizationManagerType, которое может не обязательно совпадать с именем servicename.

  <serviceBehaviors>
    <behavior name="MyCustomServiceBehavior">
      <serviceAuthorization serviceAuthorizationManagerType="BookingService.KeyAuthorizationManager, AssemblyNameFromSvcProperties" />
     </behavior>
 </serviceBehaviors>

не забудьте следовать инструкциям для serviceAuthorizationManagerType, как указано на https://docs.microsoft.com/en-us/dotnet/framework/wcf/extending/how-to-create-a-custom-authorization-manager-for-a-service

Он говорит -

Предупреждение

Обратите внимание, что когда вы указываете serviceAuthorizationManagerType, строка должна содержать полное имя типа. запятая и имя сборки, в которой определен тип. Если вы не укажете имя сборки, WCF попытается загрузить тип из System.ServiceModel.dll.

Перейдите на более старую Visual Studio. Странное решение, которое сработало для меня. Я использовал Visual Studio 2017, после перехода на Visual Studio 2015 все заработало.

В Visual Studio:

  1. свойства проекта (щелкните свой проект правой кнопкой мыши)
  2. Отладка -> Параметры запуска
  3. Убедитесь, что поле "Аргументы командной строки" пусто

Я пробовал несколько решений, упомянутых через Интернет, к сожалению, безуспешно. В моем проекте у меня есть два интерфейса (xml/json) для каждого сервиса. Добавление конечных точек mex или конфигураций привязки не помогло вообще. Но, как я заметил, я получаю эту ошибку только при запуске проекта с фокусом на файл *.svc.cs или *.config. Когда я запускаю проект, ориентированный на файл IService.cs (где определены интерфейсы), сервис добавляется без каких-либо ошибок. Это действительно странно, и, на мой взгляд, вывод - ошибка в Visual Studio 2013. Я воспроизвел такое же поведение на нескольких машинах (даже на Windows Server). Надеюсь, это кому-нибудь поможет.

В большинстве случаев это происходит из-за меньшего объема памяти. сначала проверьте, затем попробуйте другие трюки.

У меня была эта проблема. Решение состоит в том, чтобы запустить VS с правами администратора.

После этого добавьте это в ваш файл web.config и настройте его в соответствии с названием вашей службы и названием контракта.

<behaviors>
   <serviceBehaviors>
      <behavior name="metadataBehavior">
         <serviceMetadata httpGetEnabled="true" />
      </behavior>
   </serviceBehaviors>
</behaviors>
<services>
   <service name="MyService.MyService" behaviorConfiguration="metadataBehavior">
      <endpoint 
          address=""   <!-- don't put anything here - Cassini will determine address -->
          binding="basicHttpBinding" 
          contract="MyService.IMyService"/>
      <endpoint 
          address="mex" 
          binding="mexHttpBinding" 
          contract="IMetadataExchange"/>
   </service>
</services>

Пожалуйста, добавьте это в ваш Service.svc

using System.ServiceModel.Description;

Надеюсь, это поможет вам.

Другие вопросы по тегам