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 に答える