WCF: не могу вызвать собственную службу WCF

У меня есть сервис WCF, я создал ссылку на него из проекта MSTest. Вот пример того, как я вызываю сервисные методы:

IEnrollmentService serviceClient = ChannelFactory<IEnrollmentService>
    .CreateChannel(new BasicHttpBinding(),
                   new EndpointAddress("http://localhost/EnrollmentService.svc"));

PublishResult res = serviceClient.PublishEnrollmentProfile(...);

Вместо выполнения я получил следующую ошибку:

Тип контента application/xml; charset=utf-8 ответного сообщения не соответствует типу содержимого привязки (text/xml; charset=utf-8). При использовании пользовательского кодировщика убедитесь, что метод IsContentTypeSupported реализован правильно. Первые 710 байтов ответа были:Sendera:ActionNotSupportedСообщение с действием '' не может быть обработано в получателе из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть связано либо с несоответствием контракта (несоответствующие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют одинаковый контракт и одинаковую привязку (включая требования безопасности, например, Message, Transport, None).'. ---> System.Net.WebException: удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

Насколько я понял, между ContractFilter и EndpointDispatcher есть некоторые проблемы. Я пытался успокоиться, но ничего не понял...

Я также попытался вызвать методы службы wcf по-другому:

EnrollmentServiceClient serviceClient = new EnrollmentServiceClient("http://localhost/EnrollmentService.svc");

PublishResult res = serviceClient.PublishEnrollmentProfile(...);

Это возвращает мне еще одну ошибку:

Не удалось найти элемент конечной точки с именем " http://localhost/McActivation/EnrollmentService.svc" и контрактом "EnrollmentServiceReference.IEnrollmentService" в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за того, что в клиентском элементе не найден элемент конечной точки, соответствующий этому имени.

Вопрос 1:

Как правильно создать экземпляр клиента службы wcf?

Questions2:

Что не так в моем случае?

Большое спасибо.

PS С некоторыми проблемами я могу подключиться к сервису с помощью WcfTestClient, более подробная информация здесь: Служба WCF: Невозможно вызывать методы через конечную точку 'WebHttpBinding'

PPS Вот конфигурация службы 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>

1 ответ

Решение

Ваша проблема заключается в следующем: ваша служба конфигурации определяет webHttpBinding конечные точки - это конечная точка REST ("Xml-over-HTTP")....

Тем не менее, ваш клиент использует basicHttpBinding и это привязка SOAP - они не совместимы!

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

Так:

  • либо добавьте другую конечную точку в конфигурацию службы с помощью basicHttpBinding и подключиться к этой конечной точке

или же:

  • измените свою клиентскую сторону, чтобы использовать webHttpBinding
Другие вопросы по тегам