构建客户端应用程序以使用受证书保护的WCF。安装了Cert并且可以通过IE访问WSDL,但是一旦它命中CaseExists,应用程序就会抛出“FaultException`1 unended: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();
}
}
}
答案 0 :(得分:1)
您收到了类型错误异常(这就是FaultException``1
的含义)。据我所知,这些只能由服务器代码显式抛出。如果服务主机检测到证书问题,则应该抛出MessageException
。
我会检查CaseExists
的实际代码,看它是否会抛出FaultException<>
类并从那里开始。另外,尝试捕获FaultException
并查看Detail
属性的对象类型,因为它通常包含有关错误的更多信息。 (具体来说,每个单独的FaultException<T>
具体类型都将具有public T Detail
属性。)
另外,我认为这与此相关,但您确定需要指定客户端证书吗?这与保护服务(和WSDL)的服务器端证书是分开的。服务器要求客户提供证书是不寻常的(虽然不是闻所未闻),所以我确认你做的是正确的。