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