O esquema de URI fornecido 'https' é inválido; esperado 'http'. Nome do parâmetro: via


281

Estou tentando criar um serviço WCF sobre basicHttpBinding para ser usado em https. Aqui está o meu web.config:

<!-- language: xml -->
<service behaviorConfiguration="MyServices.PingResultServiceBehavior"
         name="MyServices.PingResultService">
    <endpoint address="" 
              binding="basicHttpBinding" 
              bindingConfiguration="defaultBasicHttpBinding"
              contract="MyServices.IPingResultService">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange" />
</service>
...
<bindings>
  <basicHttpBinding>
    <binding name="defaultBasicHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
...
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServices.UpdateServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

Estou conectando usando o WCFStorm, capaz de recuperar todos os metadados corretamente, mas quando chamo o método real, obtenho:

O esquema de URI fornecido 'https' é inválido; esperado 'http'. Nome do parâmetro: via


4
Em alemão, a mensagem de erro é " Esquema de URI mais recente" https "ist ungültig; erwartet wurde" http ". Nome do parâmetro: via ", caso alguém esteja pesquisando isso no Google.
precisa

Respostas:


240

Tente adicionar credenciais de mensagem no seu app.config como:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
  <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
  </security> 
</binding> 
</basicHttpBinding> 
</bindings> 

35
Obrigado por esta resposta ao OP; Eu estava tendo o mesmo problema e a alteração do modo da tag <security> do padrão "None" para "Transport" o corrigiu.
Otis

1
Exceto pelo bloco <message>, que foi rejeitado pelo IIS6 por algum motivo, isso funcionou bem.
precisa

4
copiei a mesma configuração para o meu projeto, mas isso não produz efeito. Perdi alguma coisa a acrescentar?

1
Muito obrigado. Tentei várias soluções encontradas online, mas nenhuma delas funcionou. Este foi perfeito.
Aspnetdeveloper 5/17

59

Adicionando isso como resposta, já que você não pode fazer muita formatação sofisticada nos comentários.
Eu tive o mesmo problema, exceto que estava criando e vinculando meu cliente de serviço da Web inteiramente no código.
O motivo é que a DLL estava sendo carregada em um sistema, o que proibia o uso de arquivos de configuração.

Aqui está o código que precisava ser atualizado para se comunicar via SSL ...

Public Function GetWebserviceClient() As WebWorker.workerSoapClient
    Dim binding = New BasicHttpBinding()
    binding.Name = "WebWorkerSoap"
    binding.CloseTimeout = TimeSpan.FromMinutes(1)
    binding.OpenTimeout = TimeSpan.FromMinutes(1)
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10)
    binding.SendTimeout = TimeSpan.FromMinutes(1)

    '// HERE'S THE IMPORTANT BIT FOR SSL
    binding.Security.Mode = BasicHttpSecurityMode.Transport

    Dim endpoint = New EndpointAddress("https://myurl/worker.asmx")

    Return New WebWorker.workerSoapClient(binding, endpoint)
End Function

Como você criou as classes para o seu serviço da web?
Kaiyaq

funciona! Eu tive o mesmo problema no meu c #. Basta copiar colar e resolver o problema.
user3417479

@kaiyaq - Ainda posso me conectar ao serviço para desenvolvimento com todas as coisas padrão, deixando o VS criar as classes para mim, que depois são compiladas na DLL. É apenas em tempo de execução que não consigo carregar o arquivo de configuração com todas as informações de conexão.
eidylon

BasicHttpBinding está presente via System.ServiceModel; FYI futuros leitores.
DLeh

38

Alterar de

<security mode="None">

para

<security mode="Transport">

no seu arquivo web.config. Essa alteração permitirá que você use https em vez de http


30

Você está executando isso no Cassini (servidor vs dev) ou no IIS com um certificado instalado? No passado, tive problemas ao tentar conectar pontos de extremidade seguros no servidor da web dev.

Aqui está a configuração de ligação que funcionou para mim no passado. Em vez de basicHttpBinding, ele usawsHttpBinding . Não sei se isso é um problema para você.

<!-- Binding settings for HTTPS endpoint -->
<binding name="WsSecured">
    <security mode="Transport">
        <transport clientCredentialType="None" />
        <message clientCredentialType="None"
            negotiateServiceCredential="false"
            establishSecurityContext="false" />
    </security>
</binding>

e o ponto final

<endpoint address="..." binding="wsHttpBinding"
    bindingConfiguration="WsSecured" contract="IYourContract" />

Além disso, altere a configuração do cliente para ativar a segurança de transporte.


1
IIS 7 local com certificado autoassinado instalado
isg

13
"Além disso, certifique-se de alterar a configuração do cliente para ativar a segurança de transporte." -- Bom conselho. É facilmente esquecido e o WCF não fornece pistas sobre seus erros.
Luke Puplett

não é válido negotiateServiceCredential e establishSecurityContext
Kiquenet

20

Eu tive a mesma exceção em um custom bindingcenário. Qualquer pessoa que use essa abordagem também pode verificar isso.

Na verdade, eu estava adicionando a referência de serviço de um local WSDL arquivo. Foi adicionado com sucesso e a ligação personalizada necessária foi adicionada ao arquivo de configuração. No entanto, o serviço real era https; não é http. Então mudei o httpTransport elemet como httpsTransport. Isso corrigiu o problema

<system.serviceModel>
<bindings>

  <customBinding>
    <binding name="MyBindingConfig">

      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
        messageVersion="Soap11" writeEncoding="utf-8">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </textMessageEncoding>

      <!--Manually changed httpTransport to httpsTransport-->
      <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
        maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
        bypassProxyOnLocal="false" 
        decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
        keepAliveEnabled="true" maxBufferSize="65536" 
        proxyAuthenticationScheme="Anonymous"
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
        useDefaultWebProxy="true" />
    </binding>
  </customBinding>

</bindings>

<client>
  <endpoint address="https://mainservices-certint.mycompany.com/Services/HRTest"
    binding="customBinding" bindingConfiguration="MyBindingConfig"
    contract="HRTest.TestWebserviceManagerImpl" name="TestWebserviceManagerImpl" />
</client>


</system.serviceModel>

Referências

  1. WCF com ligação personalizada em http e https

19

Eu tive exatamente o mesmo problema que o OP. Minha configuração e situação eram idênticas. Finalmente, reduzi-o a ser um problema no WCFStorm depois de criar uma referência de serviço em um projeto de teste no Visual Studio e confirmar que o serviço estava funcionando. No Storm, você precisa clicar na opção de configurações "Config" (NÃO NA "Configuração do Cliente"). Depois de clicar nisso, clique na guia "Segurança" na caixa de diálogo exibida. Verifique se "Tipo de autenticação" está definido como "Nenhum" (o padrão é "Autenticação do Windows"). Presto, funciona! Eu sempre testo meus métodos no WCFStorm enquanto os construo, mas nunca tentei usá-lo para conectar-me a um que já foi configurado no SSL. Espero que isso ajude alguém!


Eu tinha exatamente o mesmo problema, mas tinha a senha errada usando "Nome de usuário / autenticação de senha". Acontece que, se você alterar sua senha, precisará clicar no URL do serviço e no botão "Atualizar" na barra de ferramentas para que ele seja aceito.
Ryan Shillington

12

Deparamos com o mesmo problema, é assim que minha solução acabou no final:

        <basicHttpsBinding>
            <binding name="VerificationServicesPasswordBinding">
              <security mode="Transport">
              </security>
            </binding>
            <binding name="VerificationServicesPasswordBinding1" />
        </basicHttpsBinding>

Substituí basicamente todas as ocorrências de Http por Https. Você pode tentar adicionar os dois, se preferir.


5
Deve-se notar que basicHttpsBinding é 4.5 e mais recente.
Jagd

7

Se você fizer isso programaticamente e não no web.config, será:

new WebHttpBinding(WebHttpSecurityMode.Transport)

Ótimo. Eu sempre odiei os arquivos .exe.config e faço tudo por código. Isso resolveu meu problema.
precisa saber é o seguinte

4

É bom lembrar que os arquivos de configuração podem ser divididos em arquivos secundários para facilitar as alterações de configuração em diferentes servidores (dev / demo / production etc), sem a necessidade de recompilar o código / aplicativo etc. faça alterações nos pontos de extremidade sem realmente tocar nos arquivos 'reais'.

O primeiro passo é mover a seção de ligações do WPF App.Config para seu próprio arquivo separado.

A seção de comportamentos está configurada para permitir http e https (não parece afetar o aplicativo se ambos forem permitidos)

<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />

E movemos a seção de ligações para seu próprio arquivo;

 <bindings configSource="Bindings.config" /> 

No arquivo bindings.config, alternamos a segurança com base no protocolo

  <!-- None = http:// -->
  <!-- Transport = https:// -->
  <security mode="None" >

Agora, os engenheiros no local só precisam alterar o arquivo Bindings.Config e o Client.Config onde armazenamos a URL real para cada nó de extremidade.

Dessa forma, podemos alterar o terminal de http para https e vice-versa para testar o aplicativo sem precisar alterar nenhum código.

Espero que isto ajude.


2

Para recapitular a pergunta no OP:

Estou conectando [a um serviço WCF] usando o WCFStorm, capaz de recuperar todos os metadados corretamente, mas quando chamo o método real, obtenho:

O esquema de URI fornecido 'https' é inválido; esperado 'http'. Nome do parâmetro: via

Os tutoriais do WCFStorm abordam esse problema em Trabalhando com IIS e SSL .

A solução deles funcionou para mim:

  1. Para corrigir o erro, gere uma configuração de cliente que corresponda à configuração do serviço wcf. A maneira mais fácil de fazer isso é com o Visual Studio.

    • Abra o Visual Studio e adicione uma referência de serviço ao serviço. O VS irá gerar um arquivo app.config que corresponda ao serviço

    • Edite o arquivo app.config para que possa ser lido pelo WCFStorm. Por favor, consulte Carregando arquivos App.config do cliente . Certifique-se de que os atributos de terminal / @ nome e terminal / @ contrato correspondam aos valores em wcfstorm.

  2. Carregue o app.config modificado no WCFStorm [usando o botão toobar da configuração do cliente].

  3. Invoque o método Dessa vez, a invocação do método não falhará mais

O item (1) último marcador em efeito significa remover o prefixo do namespace que o VS acrescenta ao atributo do contrato do nó de extremidade, por padrão "ServiceReference1"

<endpoint ... contract="ServiceReference1.ListsService" ... />

portanto, no app.config que você carrega no WCFStorm que deseja para ListsService:

<endpoint ... contract="ListsService" ... />

2

Eu precisava das seguintes ligações para fazer o meu funcionar:

        <binding name="SI_PurchaseRequisition_ISBindingSSL">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
          </security>
        </binding>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.