0

构建客户端应用程序以使用受证书保护的 WCF。Cert 已安装并可通过 IE 访问 WSDL,但应用程序在遇到 CaseExists 时会抛出“FaultException `1 was unhanded: Invalid Certificate”。有任何想法吗?如果证书无效,在 IE 中点击 WSDL 时会不会出错?

using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Security;
using System.Security.Cryptography.X509Certificates;
using System.ServiceModel.Description;
using ConsoleApplication1.ServiceReference1;
using System.Diagnostics;
using System.ServiceModel.Channels;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // binding
            BasicHttpBinding b = new BasicHttpBinding();
            b.Security.Mode = BasicHttpSecurityMode.Transport;
            b.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

            // endpoint
            EndpointAddress ea = new EndpointAddress(
                "https://cut out endpoint.svc");

            // fire it up 
            EBondingClient client = new EBondingClient(b, ea);

            // toss in cert              
            client.ClientCredentials.Peer.PeerAuthentication.CertificateValidationMode =
                System.ServiceModel.Security.X509CertificateValidationMode.None;

            client.ClientCredentials.ClientCertificate.SetCertificate(
                StoreLocation.CurrentUser,
                StoreName.My,
                X509FindType.FindBySubjectName,
                "cut.out.cert.name");

            // call
            Console.WriteLine(client.CaseExists("hello world"));
            client.Close();
            Console.ReadLine();
        }
    }
}
4

1 回答 1

1

你得到一个类型错误异常(这就是FaultException``1意思)。据我所知,这些只能由服务器代码显式抛出。如果服务主机检测到证书问题,它应该抛出一个MessageException.

我会检查实际的代码,CaseExists看看它是否会抛出和FaultException<>分类并从那里开始。此外,尝试捕获FaultException并查看属性是什么类型的对象Detail,因为它通常包含有关故障的更多信息。(具体来说,每个单独FaultException<T>的具体类型都有一个public T Detail属性。)

另外,我认为这不相关,但是您确定需要指定客户端证书吗?这与保护服务(和 WSDL)的服务器端证书是分开的。服务器要求客户端提供证书是不寻常的(尽管并非闻所未闻),因此我会确认您正在做正确的事情。

于 2012-05-25T01:42:48.073 回答