WCF在HTTPS上生成“提供的URI方案'https'无效;预期'http'。”

时间:2012-07-16 21:39:03

标签: wcf ssl https iis-7.5

我一直在google搜索我可能找到的任何地方(包括这里的Stackoverflow),以找出我尝试将WCF服务部署到Windows 7 x64上的IIS 7.5上的错误,该服务仅通过基本HTTP身份验证的SSL运行。我在IIS中有一个站点,它具有绑定到端口50443的HTTPS以及自签名证书。 (我不能使用标准端口443,因为我们计划在已经运行Tomcat的服务器上将其部署到IIS,该服务器正在监听80和443.)

这是web.config:

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <basicHttpBinding>
        <binding name="SSLBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Basic"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="HelloWorldWcf.HelloWorldWcfService">
        <endpoint name="HelloWorldWcf.HelloWorldWcfService" 
                  address="https://mylaptop:50443/HelloWorld/Service1.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="SSLBinding" 
                  contract="HelloWorldWcf.IHelloWorldWcfService"/>
        <endpoint address="https://mylaptop:50443/HelloWorld/Service1.svc/mex" 
                  binding="mexHttpsBinding" 
                  contract="IMetadataExchange"/>
      </service>
    </services>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

如果我浏览服务端点地址并手动输入基本身份验证凭据,则会在浏览器中显示以下异常错误消息:

  

提供的URI方案“https”无效;预期'http'。
  参数名称:context.ListenUriBaseAddress

这是我尝试针对类似服务运行WCF客户端时出现的相同错误,除了它以“参数名称:via”结尾(因为调用堆栈中显示的方法的参数名称为“System”) .ServiceModel.Channels.TransportChannelFactory`1.ValidateScheme(URI via)“,实际上是”via“)。

我已经调整了服务器和客户端配置文件很多次我失去了跟踪,但上面的web.config文件是我迄今为止最好的猜测 - 它甚至不能在浏览器中运行,更不用说了WCF客户端。

通过HTTPS进行基本HTTP身份验证,在非标准SSL端口上访问IIS 7.5中托管的WCF服务需要做什么?救命! (&谢谢!)

2 个答案:

答案 0 :(得分:5)

尝试将此添加到绑定

<security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
</security> 

答案 1 :(得分:4)

Arrrrgh!好的,让它继续工作的其余步骤:

  1. 替换我的&lt; security&gt; web.config中的节点,带有burning_LEGION的。

  2. 从web.config中删除“mex”端点。 (这使我能够在我的浏览器中找到通常的“你已经创建了一个服务”友好的网页。)

  3. 在“DOMAIN \ username”字符串中转义反斜杠,我在客户端C#代码中分配给HelloWorldWcfServiceClient.ClientCredentials.UserName.UserName。 (我说“arrrrgh!”?男人,我的脸红了。)这消除了我在步骤1和2之后得到的错误:

  4.   

    System.ServiceModel.Security.MessageSecurityException:“HTTP   请求未经授权使用客户端身份验证方案'Basic'。该   从服务器收到的身份验证标头是'基本的   境界= “mylaptop”” ---&GT; System.Net.WebException:远程服务器   返回错误:(401)未经授权。

    我从here得到了第2步的想法,这让我觉得mex对HTTPS不满意,对于here的第3步,我注意到用户名是@“domain \ username”,不是“域\用户名”。

    +1 to burning_LEGION for the assist!

    所以,未回答的问题:(1)为什么安全/消息节点对不使用消息安全性的配置(仅传输安全性)有任何影响? (2)如果mex端点干扰正常操作,它的重点是什么? (3)如果mode =“TransportCredentialOnly”不能与HTTPS一起使用,为什么我没有收到错误指示?