提供的URI方案“ https”无效;预期的“ http”。参数名称:通过


281

我正在尝试通过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进行连接,该WCFStorm能够正确检索所有元数据,但是当我调用实际方法时,我得到了:

提供的URI方案“ https”无效;预期的“ http”。参数名称:通过


4
在德语中,错误消息显示为“ Das bereitgestellte URI-Schema“ https” istungültig; erwartet wurde“ http”。参数名:via “,以防有人在搜索。
Uwe Keim,

Answers:


239

尝试在您的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>标记的模式从默认的“无”更改为“传输”已修复它。
奥的斯

1
除了<message>块(由于某些原因被IIS6拒绝)之外,此方法都运行良好。
克里斯·丘布

4
复制相同的配置到我的项目,但没有任何效果。我错过了要补充的东西吗?

1
非常感谢。我尝试了几种在线找到的解决方案,但都没有用。这是完美的。
aspnetdeveloper

59

将此添加为答案,只是因为您无法在注释中进行很多精美的格式化。
除了完全用代码创建和绑定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

您是如何为您的Web服务创建类的?
kaiyaq

有用!我的C#遇到了同样的问题。只需复制粘贴即可解决问题。
user3417479 '18

@kaiyaq-我仍然可以使用所有标准的东西连接到用于开发的服务,让VS为我创建类,然后将其编译到DLL中。只是在运行时,我无法上传包含所有连接信息的配置文件。
eidylon

通过使用System.ServiceModel存在BasicHttpBinding;仅供参考。
DLeh

38

<security mode="None">

<security mode="Transport">

在您的web.config文件中。此更改将允许您使用https而不是http


30

您是在Cassini(vs开发服务器)上还是在安装了证书的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" />

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


1
安装了自签名证书的本地IIS 7
isg 2010年

13
“此外,请确保更改客户端配置以启用传输安全性。” - 好建议。太容易被忽视了,WCF不会给出错误的线索。
路加·普普利特


20

我有一个例外 custom binding情况下,。任何使用这种方法的人,也可以检查这一点。

我实际上是从local WSDL 文件添加服务引用的。它已成功添加,并且所需的自定义绑定已添加到配置文件。但是,实际的服务是https;不是http。所以我将httpTransport元素更改为 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身份验证”)。Presto,它有效!在构建它们时,我总是在WCFStorm中测试我的方法,但是从未尝试使用它来连接到已经在SSL上设置的方法。希望这对某人有帮助!


我遇到了完全相同的问题,但是使用“用户名/密码验证”输入的密码错误。事实证明,如果您更改密码,则需要单击服务的URL和工具栏上的“刷新”按钮才能使用它。
瑞安·希灵顿

12

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

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

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


5
应该注意的是basicHttpsBinding是4.5及更高版本。
Jagd

7

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

new WebHttpBinding(WebHttpSecurityMode.Transport)

大。我一直讨厌.exe.config文件,而是通过代码代替一切。这解决了我的问题。
nivs1978 '17

4

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

第一步是将绑定部分从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,然后再次返回以测试应用程序,而无需更改任何代码。

希望这可以帮助。


2

要在OP中重述该问题,请执行以下操作:

我正在使用能够正确检索所有元数据的WCFStorm连接[到WCF服务],但是当我调用实际方法时,我得到了:

提供的URI方案“ https”无效;预期的“ http”。参数名称:通过

WCFStorm教程在使用IIS和SSL中解决了此问题。

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

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

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

    • 编辑app.config文件,以便WCFStorm可以读取它。请参阅加载客户端App.config文件。确保端点/ @名称和端点/ @合同属性与wcfstorm中的值匹配。

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

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

项目(1)的最后一个项目符号实际上是指删除 VS 附加到终结点合同属性的名称空间前缀,默认情况下为“ ServiceReference1”

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

因此,在要加载到WCFStorm的app.config中,需要使用ListsService:

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

2

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.