Служба WCF работает в Почтальоне, но не работает на веб-сайте VB.NET - PullRequest
0 голосов
/ 26 марта 2019

Я создал свой первый сервис WCF, и он отлично работает в https в Postman.

Теперь я перешел к работе со службой на своем веб-сайте VB.NET и не могу получить ееработа.

Вот Web.config из службы

 <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <behaviors>
      <serviceBehaviors>
        <behavior name="inculdeExceptionDetails">
          <serviceDebug includeExceptionDetailInFaults="true " />
        </behavior>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="https">
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http" />
      <add binding="webHttpBinding" scheme="https" bindingConfiguration="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Я пробовал множество вещей на клиенте.Но сейчас я могу инициализировать класс, но когда я вызываю функцию для него, я получаю:

The provided URI scheme 'https' is invalid; expected 'http'.

Вот мой текущий web.config:

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="basicHttpBinding_ICustomZendeskWrapper">
          <security mode="None">
              <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

    <client>
      <endpoint address="https://www.myDomain.info/Webservices/WCF/CustomZendeskWrapper.svc" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding_ICustomZendeskWrapper"   contract="CustomZendeskWrapper.ICustomZendeskWrapper" />
    </client>
  </system.serviceModel>

Может ли кто-нибудь указать мне правильное направление?

Вот мои исправленные настройки:

Сервис Web.Config:

<system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
    </diagnostics>
    <behaviors>
      <serviceBehaviors>
        <behavior name="inculdeExceptionDetails">
          <serviceDebug includeExceptionDetailInFaults="true " />
        </behavior>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior>
          <webHttp />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding name="https">
          <security mode="Transport">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <protocolMapping>
      <add binding="webHttpBinding" scheme="http" />
      <add binding="webHttpBinding" scheme="https" bindingConfiguration="https" />
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Клиент Web.Config:

 <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="webHttpBinding_ICustomZendeskWrapper">
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webhttp">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="https://www.myDomain.info/Webservices/WCF/CustomZendeskWrapper.svc" binding="webHttpBinding" bindingConfiguration="webHttpBinding_ICustomZendeskWrapper" behaviorConfiguration="webhttp"   contract="CustomZendeskWrapper.ICustomZendeskWrapper" />
    </client>
  </system.serviceModel>

1 Ответ

1 голос
/ 27 марта 2019

Во-первых, ваш файл конфигурации создает службу с помощью WebHttpBinding, следовательно, ваша служба работает должным образом через http и https в стиле REST. мы должны использовать WebHttpBinding для вызова службы или отправки http-запроса на правильный URL-адрес вместо использования BasicHttpBinding.
В этом случае, если вы хотите позвонить в службу, добавив ссылку на службу, как в вашей конфигурации. Я предлагаю вам внести следующие изменения.

  1. Используйте WebHttpBinding вместо BasicHttpBinding в клиентских WebConfig.
  2. Добавить соответствующий атрибут к автоматически сгенерированной операции. [WebGet], [WebInvoke]
  3. Добавить поведение конечной точки webhttp в конечную точку клиента.

Это может сработать, но я не думаю, что вы этого хотите. Как вы знаете, мы успешно вызываем службу, только когда тип связи wcf между сервером и клиентом согласован. Другое решение для этого случая - мы создаем сервис с помощью BasicHttpBinding. Это также хорошо работает над http и http.
Пожалуйста, обратитесь к моей следующей конфигурации.
Конец сервера.

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpBinding" scheme="http"/>
      <add binding="basicHttpsBinding" scheme="https"/>
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>

Конец клиента

//use self-signed certificate
   ServicePointManager.ServerCertificateValidationCallback += delegate
            {
                return true;
            };
            ServiceReference2.Service1Client client = new ServiceReference2.Service1Client("BasicHttpsBinding_IService1");
            var result=client.GetData(234);
            Console.WriteLine(result);

Файл конфигурации.

  <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" />
                <binding name="BasicHttpsBinding_IService1">
                    <security mode="Transport" />
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://vabqia593vm:11024/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference2.IService1"
                name="BasicHttpBinding_IService1" />
            <endpoint address="https://localhost:11025/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpsBinding_IService1" contract="ServiceReference2.IService1"
                name="BasicHttpsBinding_IService1" />
        </client>
    </system.serviceModel>

Кроме того, мы должны добавить привязку http и привязку https в модуль привязки IIS. enter image description here

Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...