24

尝试在我的Silverlight应用程序中对HTTPS端点进行Web 服务调用会导致此错误:“找不到与具有绑定 WSHttpBinding 的端点的方案 https 匹配的基地址。注册的基地址方案是 [http]”

与此处发布的相同问题:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4c19271a-f5e6-4659-9e06-b556dbdcaf82/

因此,其中一个建议是:“另一个问题可能是证书名称和机器名称不一致,这导致WCF出现问题。如果是这种情况,您可以告诉 WCF 跳过验证的证书。”

好吧,我确实收到了证书错误,因为这只是一个演示服务器。

这是我设置客户端的方式:

BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Transport;
_ws = new AnnotationService.AnnotationClient(binding, new EndpointAddress(myAddress));

如何告诉 WCF 跳过验证?

4

2 回答 2

33

您可以通过允许承载 Silverlight 应用程序的 Web 服务器和远程 WCF 服务之间的跨域通信在 Silverlight 中实现此目的。

在这种情况下,您需要在托管 WCF 服务的域的根目录中放置一个clientaccesspolicy.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="SOAPAction">
        <domain uri="http://*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

以下是MSDN 对这种方法的陈述

要允许从托管在 HTTP 应用程序上的任何 Silverlight 控件访问 HTTPS 服务,您需要将<domain uri=”http:// ” />* 元素放在<allow-from>元素中。

我自己没有尝试过,但值得一试。另请务必查看以下资源以获取更多详细信息:


在 .NET 中禁用 X.509 证书验证

对于 .NET 应用程序,此示例 WCF 配置将禁用验证证书是否受信任以及它在客户端上是否仍然有效:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="DisableServiceCertificateValidation">
            <clientCredentials>
                <serviceCertificate>
                    <authentication certificateValidationMode="None"
                                    revocationMode="NoCheck" />
                </serviceCertificate>
            </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="http://localhost/MyService"
        behaviorConfiguration="DisableServiceCertificateValidation"
        binding="wsHttpBinding"
        contract="MyNamespace.IMyService"
        name="MyServiceWsHttp" />
    </client>
</system.serviceModel>

另一种解决方案是提供自定义逻辑来验证服务提供的 X.509 证书。在这种情况下,您必须根据以下内容修改配置文件:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="DisableServiceCertificateValidation">
            <clientCredentials>
                <serviceCertificate>
                    <authentication certificateValidationMode="Custom"
                                    customCertificateValidatorType="MyCertificateValidator, Client"
                                    revocationMode="NoCheck" />
                </serviceCertificate>
            </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="http://localhost/MyService"
        behaviorConfiguration="DisableServiceCertificateValidation"
        binding="wsHttpBinding"
        contract="MyNamespace.IMyService"
        name="MyServiceWsHttp" />
    </client>
</system.serviceModel>

然后创建一个派生自X509CertificateValidator的类来实现您的自定义验证逻辑。

public class MyCertificateValidator : X509CertificateValidator
{
    public override void Validate(X509Certificate2 certificate)
    {
        // Add custom validation logic
        // Throw an exception to fail validation
    }
}

与往常一样,您可以在 MSDN 上找到更详细的示例。

于 2009-01-26T14:14:49.303 回答
2

这看起来不像是证书验证错误。它看起来像一个 web 服务配置错误。您可以在服务器上发布端点的配置吗?

WCF 服务默认不支持 SSL,您需要通过创建绑定配置并使用 bindingConfiguration 属性将端点指向它来启用传输安全性。

下面是一个支持 SSL 的示例绑定配置:

<bindings>
  <basicHttpBinding>
    <binding name="SecureTransport">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

您的端点配置如下所示:

<endpoint address=""
   binding="basicHttpBinding"
   bindingConfiguration="SecureTransport"
   contract="MyServices.IWebService" />
于 2008-12-03T20:26:56.940 回答