Не удалось добавить сервис. Метаданные службы могут быть недоступны. Убедитесь, что ваш сервис работает и предоставляет метаданные.
РЕДАКТИРОВАТЬ:
После того, как я изменил 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) Убедитесь, что этот код и служба указывают на правильное имя файла и класса.
К вашему сведению - вы также можете получить эту ошибку от машины, которой не хватает свободной памяти. Я получил эту ошибку на машине с 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:
- свойства проекта (щелкните свой проект правой кнопкой мыши)
- Отладка -> Параметры запуска
- Убедитесь, что поле "Аргументы командной строки" пусто
Я пробовал несколько решений, упомянутых через Интернет, к сожалению, безуспешно. В моем проекте у меня есть два интерфейса (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;
Надеюсь, это поможет вам.