WCF SSL端点地址不是HTTPS

时间:2012-08-13 16:20:00

标签: wcf ssl

我试图在我的PC(IIS 7)上本地托管我的SSL WCF服务,由于某些原因我无法连接到它。我需要的是在调用某个函数之前使用SSL并发送信用证来验证用户。

当我连接到它时,我得到 没有端点监听https:// [计算机名称] /YYY.svc可以接受该消息。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。

内部消息是 远程服务器返回错误:(404)Not Found。

我注意到当我访问WSDL(通过https托管)时,端点地址不是http * S *,我认为这就是我的服务可能失败的原因。

这是我的WSDL

的一部分
<wsdl:service name="WSNAME">
<wsdl:port name="WSHttpBinding_INams" binding="tns:WSHttpBinding_INams">
 <soap12:address location="http://[computer name]/YYY.svc" /> 
  <wsa10:EndpointReference>
    <wsa10:Address>http://[computer name]/YYY.svc</wsa10:Address> 
     <Identity xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
       <Spn>host/[computername]</Spn> 
     </Identity>
 </wsa10:EndpointReference>

 

这是我的服务配置文件

 <service behaviorConfiguration="test" name="NewServiceType">
    <endpoint address="https://[computer name]/YYY.svc" binding="wsHttpBinding"
      bindingConfiguration="WsBinding" name="WS" contract="Authentication2.INams" />
    <endpoint address="mex" binding="mexHttpBinding" name="MX" contract="IMetadataExchange" />
    <host>
      <baseAddresses>
        <add baseAddress="https://[computer name]/XXX.svc" />
      </baseAddresses>
    </host>

任何人都可以指出我做错了什么吗?

我的web.config

   <system.serviceModel>
<protocolMapping>
  <remove scheme="http" />
  <add scheme="http" binding="wsHttpBinding" />
</protocolMapping>
<bindings>
  <wsHttpBinding>
    <binding name="wsbinding">
      <security mode="TransportWithMessageCredential">
        <transport proxyCredentialType="Basic" />
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<services>
  <service name="NewServiceType">
    <endpoint address="/WS" binding="wsHttpBinding"
      bindingConfiguration="wsbinding" name="WS" contract="Authentication3.IService1" />

    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
      name="MX" contract="IMetadataExchange" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"
        httpsGetUrl="https://[computerName]/Service1.svc" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />

2 个答案:

答案 0 :(得分:15)

发现它!!

WCF service returns 404 over https but not http

问题是我的服务元素名称是编辑器默认添加的“MyNewService”或默认名称。您必须使用完全限定名称..

<services>
  <service name="[Namespace].[service class name]">

这花费了我超过2天的不断工作和研究。如果这适合你,请投票给那些家伙回答 - 没有人提到这一点..我不能因为我还是新的

答案 1 :(得分:2)

您的端点具有由WsBinding定义的bindingConfiguration属性。应该有一个定义此配置的web.config部分,包括要使用的安全模式(如果您想使用SSL,可能是transport或transportWithMessageCredential)。

例如:

<bindings>
  <wsHttpBinding>
    <binding name="WsBinding">
       <security mode="Transport">
         <transport clientCredentialType="Windows" />
       </security>
    </binding>
  </wsHttpBinding>
</bindings>

此外,您还需要使用绑定侦听443来配置IIS,并引用适当命名的SSL证书。

对于凭证类型的Windows:

  

这对应于IIS中的集成Windows身份验证。设定时   对于此值,服务器也应该存在于Windows上   使用Kerberos协议作为其域控制器的域。   关于MSDN WCF transport security page

的详细信息

或者,您可以使用TransportWithMessageCredential。这使用SSL来加密连接,凭证在消息本身中传递(实际上是SOAP头中的用户名和密码)。在这种情况下,您的绑定配置看起来更像:

       <security mode="TransportWithMessageCredential">
         <transport clientCredentialType="None" />
         <message clientCredentialType="Username" />
       </security>

然后,您需要在服务上定义密码验证程序行为以检查用户和密码。以下是有关此问题的更多信息:http://msdn.microsoft.com/en-us/library/aa354508.aspx