Служба WCF возвращает ошибку при вызове метода из клиента после перехода с http на https "Несоответствие ContractFilter в EndpointDispatcher"
Я создал HTTP-службу wcf, которая будет использоваться клиентом Windows и использоваться. У меня не было проблем, пока я не использовал HTTP. Теперь мой клиент хочет изменить сайт на HTTPS. Поэтому для целей разработки я использовал сертификат IIS express и настроил сервис. Теперь мой сервис запущен в IIS с самозаверяющим сертификатом iisexpress. Я могу просматривать мою новую службу https через браузер, а также через инструмент тестирования клиента wcf.
Но когда я пытаюсь вызвать метод из моего приложения Windows к новой службе https wcf. Мой экземпляр службы создан, но только при вызове метода я получаю следующую ошибку:
Исключение System.ServiceModel.ActionNotSupportedException не было обработано кодом пользователя HResult=-2146233087 Сообщение = Сообщение с действием " http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence" не может быть обработано в получателе, так как несоответствие ContractFilter в EndpointDispatcher. Это может быть связано либо с несоответствием контракта (несовпадающие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют одинаковый контракт и одинаковую привязку (включая требования безопасности, например, Сообщение, Транспорт, Нет).
В сервисе мой конфиг привязки (конфиг 3 используется в режиме https, а конфиг 2 использовался в режиме http):
<bindings>
<wsHttpBinding>
<binding name="wsHttpBinding_IPGPService">
<!--config test 1 - start -->
<!--<security mode="None">
<transport clientCredentialType="None" />
<message establishSecurityContext="false" />
</security>-->
<!--config test 1 - end -->
<!--config test 2 - start -->
<!--<security mode="None" />
<reliableSession enabled="true" />-->
<!--config test 2 - end -->
<!--config test 3 - start -->
<!--<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"/>
<message clientCredentialType="Certificate" algorithmSuite="Default" />
</security>-->
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
<!--config test 3 - end -->
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="PGPService.PGPService">
<endpoint address="" binding="wsHttpBinding" contract="PGPService.IPGPService" bindingConfiguration="wsHttpBinding_IPGPService" />
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<serviceBehaviors>
<behavior>
<!-- To avoid disclosing metadata information, set the values below to false before deployment -->
<!--<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> -->
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<!--<serviceDebug includeExceptionDetailInFaults="false"/>-->
<!--test config - start-->
<serviceDebug includeExceptionDetailInFaults="True" />
<!--test config - end-->
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
В клиенте мы используем пользовательскую привязку для создания экземпляра сервиса.
url = "https://localhost:550/TestService/TestService.svc";
customBinding = new CustomBinding();
customBinding.Elements.Add(new ReliableSessionBindingElement());
customBinding.Elements.Add(new HttpsTransportBindingElement());
EndpointAddress endpointAdress = new EndpointAddress(url);
pgpServiceClientInstance = new PGPServiceClient(customBinding, endpointAdress);
pgpServiceClientInstance.ClientCredentials.ClientCertificate.SetCertificate(
StoreLocation.CurrentUser,
StoreName.Root,
X509FindType.FindByThumbprint,
"03815c894b62dcf2d17336ade2d9ca61ddb7f92c");
После добавления ссылки на службу app.config, сгенерированный в моем приложении Windows, выглядит следующим образом:
<bindings>
<wsHttpBinding>
<binding name="WSHttpBinding_IPGPService">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost:550/TestService/TestService.svc"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IPGPService"
contract="PGPServiceReference.IPGPService" name="WSHttpBinding_IPGPService" />
</client>
Теперь я вижу, что мой экземпляр службы успешно создан. но во время вызова метода я получаю ошибку выше.
Код не изменяется до и после перехода на https в конце службы. Это тот же сервисный код. Он полностью работал на http, но не работает на https.
Я полностью удалил ссылку на сервис и добавил ее заново после того, как мой wcf сервис https. Самозаверяющий сертификат IIS Express уже установлен и доступен в моей системе. Сервис и клиент работают в той же системе, что и сейчас, так как это разработка
Я подозреваю, что у меня проблемы с конфигурацией.... но с меньшим опытом я не мог понять.
1 ответ
На самом деле это была дополнительная привязка во время создания службы, которая вызывала проблему. Получил это, комментируя ниже строку в части создания.
url = "https://localhost:550/TestService/TestService.svc";
customBinding = new CustomBinding();
//customBinding.Elements.Add(new ReliableSessionBindingElement());
customBinding.Elements.Add(new HttpsTransportBindingElement());
Это помогло мне приступить к разработке всего сервиса и клиента. Итак, на этом мое исправление для вышеуказанного вопроса завершено.
Вниз по дорожке, так как я новичок в сервисе wcf, я столкнулся со следующими проблемами, с которыми столкнулся и решил. Кто-то, кто борется, как я, может использовать ниже шаг, если вы сталкиваетесь с моими ошибками
Затем у моей службы возникли проблемы с доступом к папке. Исправлено: добавление отдельного пула приложений с помощью учетной записи службы или администратора с достаточными правами.
Добавить сессию wcf к существующему коду. Исправлено: Это где я сталкиваюсь с проблемой, потому что я использовал wshttpbinding с безопасностью транспорта. Затем, после просмотра нескольких понятных материалов и кодов, я должен сделать свою конфигурацию для привязки по индивидуальному заказу с надежной сессией и httpstransport для продолжения разработки. так что мой конфиг примерно выглядит как
<customBinding abc of wcf> <reliableSession/> <httpsTransport/> <\customBinding>
А также не комментирует приведенную выше строку создания экземпляра сервиса после понимания его реального предназначения. Нет необходимости в каких-либо значениях в надежном теге сеанса и httpsTransport для базовой поддержки безопасности.
Это решило мою вторую проблему.
- Однако я сталкиваюсь с ошибкой импорта wsdl в инструменте тестирования клиента wcf, которую я сейчас пытаюсь решить. Опция генерации прокси-сервера svcutil или добавление ссылки на службу с опцией непроверенной сборки, похоже, не работает. Кроме того, я заметил, что даже если добавить ссылку на мою службу заново в клиент, нет никаких конфигураций, сгенерированных для моего файла app.config, что удивительно..... и вышеупомянутые параметры не помогают..... поиск идей экспертов.... Исправление:??? Expolring.... Души, которые читают это, могут дать ответ / предложение.