Служба WCF: невозможно вызвать методы через конечную точку "WebHttpBinding"
Я создал сервис WCF, вот его раздел конфигурации:
<system.serviceModel>
<services>
<service name="McActivationApp.EnrollmentService" behaviorConfiguration="McActivationApp.EnrollmentServicBehavior">
<endpoint address="" binding="webHttpBinding" contract="McActivationApp.IEnrollmentService"/>
<endpoint address="mex" binding="mexHttpBinding" contract="McActivationApp.IEnrollmentService" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="McActivationApp.EnrollmentServicBehavior">
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>
Я подключился к службе с помощью WcfTestClient, добавил службу и могу вызывать только те методы, которые находятся в разделе "IEnrollmentService (MetadataExchangeHttpBinding_IEnrollmentService)" (они работают как положено).
Но методы из другого раздела "IEnrollmentService (WebHttpBinding_IEnrollmentService)" не могут быть вызваны. Когда я пытаюсь вызвать любой из них, я получаю следующую ошибку:
Не удалось вызвать службу. Возможные причины: служба недоступна или недоступна; конфигурация на стороне клиента не соответствует прокси; существующий прокси-сервер недействителен. Обратитесь к трассировке стека для более подробной информации. Вы можете попытаться выполнить восстановление, запустив новый прокси-сервер, восстановив конфигурацию по умолчанию или обновив службу.
Детали ошибки:
The Address property on ChannelFactory.Endpoint was null. The ChannelFactory's Endpoint must have a valid Address specified.
at System.ServiceModel.ChannelFactory.CreateEndpointAddress(ServiceEndpoint endpoint)
at System.ServiceModel.ChannelFactory`1.CreateChannel()
at System.ServiceModel.ClientBase`1.CreateChannel()
at System.ServiceModel.ClientBase`1.CreateChannelInternal()
at System.ServiceModel.ClientBase`1.get_Channel()
at EnrollmentServiceClient.UpdateEnrollmentProfile(String enrollmentId, String siteName, String deployServerName, Int32 methodId, String deviceClass, String deviceName, String registrationCode)
Вопрос 1: Правильно ли я понимаю, что в случае вызова методов "IEnrollmentService (WebHttpBinding_IEnrollmentService)" мне нужно дополнительно указать некоторую конечную точку?
Вопрос 2: Могу ли я получить это работоспособным вообще?
Вопрос 3: Должен ли я заботиться о них (так как я смогу вызывать методы из своего "пользовательского" приложения)?
3 ответа
Спасибо, ребята, за ваши ответы, они дали мне немного еды, чтобы подумать. Вот ответы на мои вопросы:
Ответ1:
На самом деле, как указано в "marc_s", проблема заключается в том, что моя служба была настроена как служба "REST", поэтому ответ "Да", чтобы эти службы были доступны для приложения WcfTestClient. Требуется дополнительная конечная точка (basicHttpBinding).
Ответ2:
Как указано в "answer1": да, чтобы это работало, вам нужно добавить базовую конечную точку HttpBinding.
Ответ3:
Это зависит. Если вы не планируете проводить "тестирование" с помощью WcfTestClient - все равно. В моем конкретном случае я буду реализовывать модульные тесты для проверки результатов вызова метода, поэтому работоспособность в WcfTestClient не важна.
Спасибо вам и +1 за каждый полезный ответ.
PS Причина, по которой я принял собственный ответ, заключается в том, что он согласуется с вопросами (которые важны для меня).
Вы должны иметь возможность вызывать методы в службе с webHttpBinding
(REST) с использованием обычного браузера - не требуется WcfTestClient... в этом весь смысл (и преимущество) REST - это всего лишь служба "XML-over-HTTP" (значительно упрощенная).
Просто наведите ваш браузер на конечную точку вашего сервиса
http://YourServer/YourVirtualDirectory/YourService.svc
и вы должны увидеть свою службу там...