WCF: не могу вызвать собственную службу WCF - PullRequest
4 голосов
/ 10 января 2011

У меня есть сервис 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. Это может быть из-за несоответствие контракта (несоответствующие действия между отправителем и получателем) или несоответствие привязки / безопасности между отправитель и получатель. Проверь это отправитель и получатель имеют одинаковые договор и та же обязательная (включая требования безопасности, например, Сообщение, Транспорт, Никто).'. ---> 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 раздел конфигурации. Это может быть потому что файл конфигурации не был найден для вашего приложения, или потому что нет элемента конечной точки, соответствующего этому имени можно найти в клиентском элементе ..

Question1:

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

Questions2:

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

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

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

P.P.S. Вот конфигурация службы 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 Ответ

8 голосов
/ 10 января 2011

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

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

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

Итак:

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

или

  • изменить сторону клиента на использование webHttpBinding
...