제공된 URI 체계 'https'가 유효하지 않습니다. 'http'가 필요합니다. 매개 변수 이름 : via


281

https를 통해 basicHttpBinding을 통해 WCF 서비스를 만들려고합니다. 내 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>

모든 메타 데이터를 올바르게 검색 할 수있는 WCFStorm을 사용하여 연결하고 있지만 실제 메소드를 호출하면 얻을 수 있습니다.

제공된 URI 체계 'https'가 유효하지 않습니다. 'http'가 필요합니다. 매개 변수 이름 : via


4
독일어에서 오류 메시지는 " Das bereitgestellte URI-Schema"https "ist ungültig; erwartet wurde"http "입니다. 매개 변수 이름 : via ".
Uwe Keim

답변:


240

app.config에 다음과 같이 메시지 자격 증명을 추가하십시오.

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

35
OP에 대한이 답변에 감사드립니다. 동일한 문제가 발생하여 <security> 태그의 모드를 기본값 "없음"에서 "전송"으로 변경하면 문제가 해결되었습니다.
Otis

1
어떤 이유로 IIS6에 의해 거부 된 <message> 블록을 제외하고는 잘 작동했습니다.
Chris Chubb

4
동일한 구성을 내 프로젝트에 복사했지만 아무런 효과가 없습니다. 추가해야 할 것이 있습니까?

1
정말 고맙습니다. 온라인에서 찾은 몇 가지 솔루션을 시도했지만 그중 아무것도 작동하지 않았습니다. 이것은 완벽했다.
aspnetdeveloper 2016 년

59

주석에서 멋진 형식을 지정할 수 없기 때문에 이것을 답변으로 추가하십시오.
웹 서비스 클라이언트를 완전히 작성하고 코드로 바인딩하는 것을 제외하고는 동일한 문제가있었습니다.
이유는 DLL이 시스템에 업로드되어 구성 파일을 사용할 수 없기 때문입니다.

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

웹 서비스에 대한 클래스를 어떻게 만들었습니까?
kaiyaq

효과가있다! 내 C #에서 같은 문제가있었습니다. 붙여 넣기 만하면 문제가 해결됩니다.
user3417479

@kaiyaq-VS는 클래스를 만들어 DLL로 컴파일 할 수 있도록 모든 표준 항목으로 개발하기 위해 서비스에 계속 연결할 수 있습니다. 런타임에 모든 연결 정보가있는 구성 파일을 업로드 할 수 없습니다.
eidylon

BasicHttpBinding은 System.ServiceModel을 사용하여 제공됩니다. 참고로 미래 독자들.
DLeh

38

에서 변경

<security mode="None">

<security mode="Transport">

web.config 파일에. 이 변경으로 http 대신 https를 사용할 수 있습니다.


30

Cassini (vs dev 서버) 또는 인증서가 설치된 IIS에서 이것을 실행하고 있습니까? 과거에는 dev 웹 서버에서 보안 엔드 포인트를 연결하려고 시도하는 데 문제가있었습니다.

과거에 나를 위해 일한 바인딩 구성은 다음과 같습니다. 대신을 basicHttpBinding사용합니다 wsHttpBinding. 그것이 당신에게 문제가되는지 모르겠습니다.

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

그리고 종점

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

또한 전송 보안을 사용하도록 클라이언트 구성을 변경하십시오.


1
자체 서명 인증서가 설치된 로컬 IIS 7
isg

13
"또한 전송 보안을 사용하도록 클라이언트 구성을 변경해야합니다." -- 좋은 조언. 너무 쉽게 간과하고 WCF는 오류에 대한 단서를 제공하지 않습니다.
Luke Puplett 2016 년

유효하지 negotiateServiceCredential 및 establishSecurityContext
Kiquenet

20

custom binding시나리오 에서 동일한 예외가있었습니다 . 이 방법을 사용하는 사람은 누구나 이것을 확인할 수 있습니다.

실제로 local WSDL 파일 에서 서비스 참조를 추가하고있었습니다 . 성공적으로 추가되었으며 필요한 사용자 정의 바인딩이 구성 파일에 추가되었습니다. 그러나 실제 서비스는 https였습니다. http가 아닙니다. 그래서 httpTransport elemet을로 변경했습니다 httpsTransport. 이 문제를 해결

<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>

참고 문헌

  1. http 및 https 모두에 사용자 정의 바인딩이있는 WCF

19

OP와 정확히 동일한 문제가있었습니다. 내 구성과 상황이 동일했습니다. 마지막으로 Visual Studio의 테스트 프로젝트에서 서비스 참조를 만들고 서비스가 작동하고 있음을 확인한 후 WCFStorm에서 문제로 축소했습니다. Storm에서는 "클라이언트 구성"이 아닌 "구성"설정 옵션을 클릭해야합니다. 클릭 한 후 나타나는 대화 상자에서 "보안"탭을 클릭하십시오. "인증 유형"이 "없음"으로 설정되어 있는지 확인하십시오 (기본값은 "Windows 인증"). 프레스토, 작동합니다! 필자는 항상 WCFStorm에서 메소드를 빌드 할 때 항상 메소드를 테스트하지만 SSL을 사용하여 이미 설정된 메소드에 연결하려고 시도한 적이 없습니다. 이것이 누군가를 돕기를 바랍니다!


이 동일한 문제가 있었지만 "사용자 이름 / 암호 인증"을 사용하여 잘못된 암호를 사용했습니다. 비밀번호를 변경하면 서비스의 URL과 툴바의 "새로 고침"버튼을 클릭해야합니다.
Ryan Shillington

12

같은 문제에 부딪 쳤습니다.

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

나는 기본적으로 모든 Http 발생을 Https로 대체했습니다. 원하는 경우 두 가지를 모두 추가 할 수 있습니다.


5
basicHttpsBinding은 4.5 이상입니다.
Jagd

7

web.config가 아닌 프로그래밍 방식 으로이 작업을 수행하는 경우 :

new WebHttpBinding(WebHttpSecurityMode.Transport)

큰. 나는 항상 .exe.config 파일을 싫어하고 대신 코드로 모든 것을 수행합니다. 이것은 내 문제를 해결했다.
nivs1978

4

코드 / 앱 등을 다시 컴파일하지 않고도 다른 서버 (dev / demo / production 등)에서 구성 변경을보다 쉽게 ​​수행 할 수 있도록 구성 파일을 보조 파일로 분할 할 수 있습니다. 예를 들어, 현장 엔지니어가 실제로 '실제'파일을 건드리지 않고 엔드 포인트를 변경하십시오.

첫 번째 단계는 바인딩 섹션을 WPF App.Config에서 별도의 파일로 옮기는 것입니다.

동작 섹션은 http와 https를 모두 허용하도록 설정되어 있습니다 (둘 다 허용되는 경우 앱에 영향을 미치지 않는 것 같습니다)

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

바인딩 섹션을 자체 파일로 옮깁니다.

 <bindings configSource="Bindings.config" /> 

bindings.config 파일에서 프로토콜을 기반으로 보안을 전환합니다

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

이제 현장 엔지니어는 각 끝점에 대한 실제 URL을 저장하는 Bindings.Config 파일과 Client.Config 만 변경하면됩니다.

이를 통해 코드를 변경하지 않고도 엔드 포인트를 http에서 https로 변경 한 후 다시 테스트하여 앱을 테스트 할 수 있습니다.

도움이 되었기를 바랍니다.


2

OP에서 질문을 다시 요약하려면 :

모든 메타 데이터를 올바르게 검색 할 수있는 WCFStorm을 사용하여 [WCF 서비스에 연결 중]이지만 실제 메소드를 호출하면 다음과 같은 결과가 나타납니다.

제공된 URI 체계 'https'가 유효하지 않습니다. 'http'가 필요합니다. 매개 변수 이름 : via

WCFStorm 자습서 는 IIS 및 SSL 작업 에서이 문제를 해결 합니다 .

그들의 해결책은 나를 위해 일했습니다 :

  1. 오류를 수정하려면 wcf 서비스 구성과 일치하는 클라이언트 구성을 생성하십시오. 가장 쉬운 방법은 Visual Studio를 사용하는 것입니다.

    • Visual Studio를 열고 서비스에 서비스 참조를 추가하십시오. VS는 서비스와 일치하는 app.config 파일을 생성합니다

    • app.config 파일을 WCFStorm에서 읽을 수 있도록 편집하십시오. Client App.config 파일로드를 참조하십시오 . endpoint / @ name 및 endpoint / @ contract 속성이 wcfstorm의 값과 일치하는지 확인하십시오.

  2. 수정 된 app.config를 클라이언트 구성 도구 모음 단추를 사용하여 WCFStorm에로드하십시오.

  3. 메소드를 호출하십시오. 이번에는 메소드 호출이 더 이상 실패하지 않습니다.

항목 (1)의 마지막 글 머리 기호는 VS가 엔드 포인트 계약 속성 앞에 붙는 네임 스페이스 접두사 를 기본적으로 "ServiceReference1" 로 제거함을 의미합니다.

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

따라서 app.config에서 WCFStorm에로드하면 ListsService에 대해 원하는 것입니다.

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

2

내 일을하려면 다음과 같은 바인딩이 필요했습니다.

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

1

silverlight가 지원하지 않기 때문에 wsHttpBinding이 문제입니다!


참고 : Windows Phone 7, Windows Phone 8 또는 WinRT를 수행하지 마십시오.
Jon B

silverlight에 대한 답변을 추가했습니다
Simon_Weaver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.