Служба 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, я столкнулся со следующими проблемами, с которыми столкнулся и решил. Кто-то, кто борется, как я, может использовать ниже шаг, если вы сталкиваетесь с моими ошибками

  1. Затем у моей службы возникли проблемы с доступом к папке. Исправлено: добавление отдельного пула приложений с помощью учетной записи службы или администратора с достаточными правами.

  2. Добавить сессию wcf к существующему коду. Исправлено: Это где я сталкиваюсь с проблемой, потому что я использовал wshttpbinding с безопасностью транспорта. Затем, после просмотра нескольких понятных материалов и кодов, я должен сделать свою конфигурацию для привязки по индивидуальному заказу с надежной сессией и httpstransport для продолжения разработки. так что мой конфиг примерно выглядит как

    <customBinding abc of wcf>
      <reliableSession/>
      <httpsTransport/>
    <\customBinding>
    

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

Это решило мою вторую проблему.

  1. Однако я сталкиваюсь с ошибкой импорта wsdl в инструменте тестирования клиента wcf, которую я сейчас пытаюсь решить. Опция генерации прокси-сервера svcutil или добавление ссылки на службу с опцией непроверенной сборки, похоже, не работает. Кроме того, я заметил, что даже если добавить ссылку на мою службу заново в клиент, нет никаких конфигураций, сгенерированных для моего файла app.config, что удивительно..... и вышеупомянутые параметры не помогают..... поиск идей экспертов.... Исправление:??? Expolring.... Души, которые читают это, могут дать ответ / предложение.
Другие вопросы по тегам