提供的URI方案“https”无效;预计'http'。参数名称:via

时间:2010-03-12 20:53:01

标签: c# wcf https

我正在尝试通过basicHttpBinding创建一个WCF服务,以便在https上使用。这是我的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

17 个答案:

答案 0 :(得分:224)

尝试在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> 

答案 1 :(得分:51)

添加此作为答案,因为你不能在评论中做很多花哨的格式化 我有同样的问题,除了我在代码中完全创建和绑定我的Web服务客户端 原因是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

答案 2 :(得分:29)

您是在Cassini(vs dev服务器)上运行此程序还是在安装了证书的IIS上运行此程序?我过去曾尝试在开发Web服务器上连接安全端点。

这是过去对我有用的绑定配置。它使用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" />

另外,请确保更改客户端配置以启用传输安全性。

答案 3 :(得分:27)

更改 来自

<security mode="None">

<security mode="Transport">
在您的web.config文件中

。此更改将允许您使用https而不是http

答案 4 :(得分:20)

我和OP有同样的问题。我的配置和情况完全相同。在Visual Studio中的测试项目中创建服务引用并确认该服务正在运行后,我最终将其缩小为WCFStorm中的问题。在Storm中,您需要单击“配置”设置选项(而不是“客户端配置”)。单击后,单击弹出对话框中的“安全”选项卡。确保“身份验证类型”设置为“无”(默认为“Windows身份验证”)。 Presto,它的作品!我总是在WCFStorm中测试我的方法,因为我正在构建它们,但从未尝试使用它来连接已经在SSL上设置的方法。希望这有助于某人!

答案 5 :(得分:16)

我在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. WCF with custombinding on both http and https

答案 6 :(得分:11)

遇到同样的问题,这就是我的解决方案最终结果:

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

我基本上用Https替换了每次出现的Http。如果您愿意,可以尝试添加它们。

答案 7 :(得分:5)

如果以编程方式执行此操作,而不是在web.config中执行此操作:

new WebHttpBinding(WebHttpSecurityMode.Transport)

答案 8 :(得分:3)

值得记住的是,配置文件可以跨辅助文件拆分,以便在不同的服务器(开发/演示/生产等)上更轻松地进行配置更改,而无需重新编译代码/应用程序等。 例如,我们使用它们来允许现场工程师进行端点更改,而无需实际触及“真实”工具。文件。

第一步是将绑定部分从WPF App.Config中移出到它自己的单独文件中。

行为部分设置为允许http和https(如果两者都允许,似乎不会对应用产生影响)

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

我们将绑定部分移到自己的文件中;

 <bindings configSource="Bindings.config" /> 

在bindings.config文件中,我们根据协议

切换安全性
  <!-- None = http:// -->
  <!-- Transport = https:// -->
  <security mode="None" >

现在,现场工程师只需要更改Bindings.Config文件和Client.Config,我们存储每个端点的实际URL。

这样我们可以将端点从http更改为https,然后再返回以测试应用,而无需更改任何代码。

希望这有帮助。

答案 9 :(得分:2)

重新限制OP中的问题:

  

我使用WCFStorm连接[WCF服务],它可以正确检索所有元数据,但当我调用实际方法时,我得到:

     

提供的URI方案“https”无效;预计'http'。参数名称:via

WCFStorm教程在Working with IIS and SSL中解决了这个问题。

他们的解决方案对我有用:

  
      
  1. 要修复错误,请生成与wcf服务配置匹配的客户端配置。最简单的方法是使用Visual Studio。

         
        
    • 打开Visual Studio并向服务添加服务引用。 VS将生成与服务匹配的app.config文件

    •   
    • 编辑app.config文件,以便WCFStorm可以读取该文件。请参阅Loading Client App.config files。确保endpoint / @ name和endpoint / @ contract属性与wcfstorm中的值匹配。

    •   
  2.   
  3. 将修改后的app.config加载到WCFStorm [使用Client Config toobar按钮]。

  4.   
  5. 调用方法。这次方法调用将不再失败

  6.   

项目(1)生效的最后一个子弹意味着删除VS前缀为端点契约属性的命名空间前缀,默认情况下为“ServiceReference1”

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

所以在您加载到WCFStorm的app.config中需要ListsService:

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

答案 10 :(得分:2)

我需要以下绑定才能让我的工作:

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

答案 11 :(得分:1)

wsHttpBinding是一个问题,因为silverlight不支持它!

答案 12 :(得分:0)

我通过Visual Studio向我们的项目中添加了一个“连接服务”,该服务生成了创建客户端的默认方法。

var client = new MyWebService.Client(MyWebService.Client.EndpointConfiguration.MyPort, _endpointUrl);

此构造函数继承ClientBase,并在扫描程序的背后通过使用自己的方法Client.GetBindingForEndpoint(endpointConfiguration)创建Binding。

public Client(EndpointConfiguration endpointConfiguration, string remoteAddress) :
            base(Client.GetBindingForEndpoint(endpointConfiguration), 
                 new System.ServiceModel.EndpointAddress(remoteAddress))

此方法对https服务和http服务具有不同的设置。 如果要从http获取数据,则应使用 TransportCredentialOnly

System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly;
 

对于https,您应该使用 Transport

result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;

答案 13 :(得分:0)

<!-- Binding settings for HTTPS endpoint -->
<binding name="yourServiceName">
    <security mode="Transport">
        <transport clientCredentialType="None" />
        <!-- Don't use message -->
    </security>
</binding>

答案 14 :(得分:0)

我的解决方案遇到了同样的错误消息,比上面的解决方案还要简单,我只是将了更新为basicHttpsBinding>

  <bindings>
    <basicHttpsBinding>
    <binding name="ShipServiceSoap" maxBufferPoolSize="512000" maxReceivedMessageSize="512000" />
    </basicHttpsBinding>
    </bindings>

与以下部分相同:

  <client>
    <endpoint address="https://s.asmx" binding="basicHttpsBinding" bindingConfiguration="ShipServiceSoap" contract="..ServiceSoap" name="ShipServiceSoap" />
    </client>

答案 15 :(得分:0)

FWIW 如果您在向调用 https 服务的应用程序添加服务引用时不小心,可能会发生此错误

例如,如果您删除了以前的服务引用(以前是 http://example.com/Service.svc),然后重新创建它,现在它是 https://example.com/service.svc

如果在重新创建服务引用之前不小心删除 web.config 中的旧客户端和绑定,它将创建 BasicHttpBinding_IService1 而不是 BasicHttpBinding_IService。然后,当您将应用程序部署到实际服务器时,它会说“https 是无效的预期 http”,因为它不再寻找 BasicHttpBinding_IService1 而不是 BasicHttpBinding_IService。

与此同时,您正在尝试上述所有建议,但没有结果。

只是想我会把它扔掉。

答案 16 :(得分:0)

就我在 web.config 中的情况而言,我必须在端点定义中将 binding="basicHttpsBinding" 更改为 binding="basicHttpBinding" 并将相关 bindingConfiguration 复制到 basicHttpBinding 部分