5

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

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

内部消息是远程服务器返回错误:(404)未找到。

我注意到的是,当我访问 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" />

4

2 回答 2

16

找到了 !!

WCF 服务通过 https 而不是 http 返回 404

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

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

这花费了我 2 天的持续工作和研究。如果这对你有用,请投票让这些人回答 - 没有人提到过这一点..我不能因为我还是新手

于 2012-08-14T10:35:39.810 回答
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 证书。

对于凭证类型的窗口:

这对应于 IIS 中的集成 Windows 身份验证。当设置为该值时,服务器也应该存在于使用 Kerberos 协议作为其域控制器的 Windows 域中。MSDN WCF 传输安全页面上的更多详细信息

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

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

然后,您需要在服务上定义密码验证器行为以检查用户和密码。这里有一些更多的信息:http: //msdn.microsoft.com/en-us/library/aa354508.aspx

于 2012-08-14T08:17:03.407 回答