Не удалось добавить службу. Метаданные службы могут быть недоступны. Убедитесь, что ваша служба запущена и подвержена метаданным. `
EDIT:
После того, как я изменил 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 и запускаю проект самостоятельно, поэтому я предполагаю, что служба также запущена...
Что здесь может быть неправильным?
END EDIT
Я только что создал новые службы wcf, и когда я ударил f5 из VS, и я получу эту ошибку в окне клиента WCF Test:
Не удалось добавить службу. Метаданные службы могут быть недоступны. Убедитесь, что ваша служба запущена и подвержена метаданным.
Ошибка: невозможно получить метаданные из 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>
Ответы
Ответ 1
Вам нужно добавить конечную точку обмена метаданных (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>
Теперь вы сможете получать метаданные для своей службы
Обновление: ok, поэтому вы просто запускаете это из 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 app вы должны иметь возможность получать метаданные службы из: a) адреса, на котором Cassini запускает вашу службу, или b) адрес mex (адрес Cassini + /mex
)
Ответ 2
Если вы переименуете файл SVC, убедитесь, что ваша разметка верна.
Вам нужно будет изменить конфигурацию по умолчанию и выполнить следующие действия:
1) Перейдите в файл SVC правой кнопкой мыши и выберите вид разметки.
2) Убедитесь, что этот код и служба указывают на правильное имя файла и класса.
Ответ 3
FYI - ВЫ МОЖЕТЕ также получить эту ошибку с компьютера, на котором не хватает свободного места. Я получил эту ошибку на машине, в которой я запускаю 16 гигабайт памяти, У меня была виртуальная машина с 6 концертами и много приложений с интенсивной памятью. Закройте немного, и эта проблема исчезла.
Я все еще получил ошибку в заголовке вопроса
Не удалось добавить службу. Метаданные службы могут быть недоступны. Убедитесь, что ваша служба запущена и выставляет метаданные. `
Я заметил большее сообщение о памяти, хотя при использовании тестового клиента WCF.
Надеюсь, это поможет кому-то еще.
Ответ 4
Добавьте Serializable()
перед тем типом, который вы показываете
Serializable()
Public Class YourType
Поместите Serializable
в <>
Ответ 5
В моем случае я получал эту ошибку, потому что опция (HttpActivation) не была включена.
![Диалоговое окно функций Windows, показывающее активацию HTTP в службах WCF в .NET Framework 4.6 Advanced Services]()
Ответ 6
при работе с сервисом WCF.NET 4.0 - убедитесь, что Global.asax не находится в исходном каталоге. Если это так, то он подбирается во время выполнения и пытается скомпилироваться в...
Ответ 7
изменение типа привязки от wsHttpbinding к привязке basichttp в теге конечной точки и от wsHttpbinding к mexhttpbinginding в теге точки метаданных помогло преодолеть ошибку. Спасибо...
Ответ 8
В моем случае, комментируя
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
в файле web.config метался "Не удалось добавить службу. Метаданные службы могут быть недоступны. Убедитесь, что ваша служба запущена и выставляет метаданные".
Ответ 9
Я попробовал несколько решений, упомянутых в Интернете, к сожалению, без каких-либо успехов.
В моем проекте у меня есть два интерфейса (xml/json) для каждой службы. Добавление mex конечных точек или связывание конфигураций не помогло вообще.
Но, я заметил, я получаю эту ошибку только при запуске проекта с фокусом *.svc.cs или *.config. Когда я запускаю проект с сосредоточенным файлом IService.cs(где определены интерфейсы), служба добавляется без каких-либо ошибок. Это действительно странно, и, на мой взгляд, вывод - ошибка в Visual Studio 2013.
Я воспроизвел такое же поведение на нескольких машинах (даже на машине Windows Server).
Надеюсь, это поможет кому-то.
Ответ 10
В большинстве случаев это происходит из-за меньшего объема памяти. сначала проверьте, затем попробуйте другие трюки.
Ответ 11
Свойство IsOneWay=true
может иметь значение true в операционном контракте интерфейса.
Удалите это свойство, чтобы избавиться от этой ошибки.
Ответ 12
В моем случае Webservice генерировал сборку с именем, отличным от имени проекта/службы. Он был задан так моим разработчиком-предшественником, который работал над решением, и я не знал.
Было установлено -
<serviceBehaviors>
<behavior name="CustomServiceBehavior">
<serviceAuthorization serviceAuthorizationManagerType="BookingService.KeyAuthorizationManager, BookingService" />
</behavior>
</serviceBehaviors>
Итак, исправлением было правильное имя сборки в serviceAuthorizationManagerType. Название сборки можно получить по следующему пути сервисного проекта:
Щелкните правой кнопкой мыши на WCF svc project--> Выберите "Свойства" → В списке вкладок выберите "Приложение". Сравните значение с полем "Имя сборки:" в списке. Это 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.
Ответ 13
Я заметил, что когда я удалил 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);
}
Ответ 14
После добавления этого в файл 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;
Надеюсь, это поможет вам.