C# 用.net2.0和.net4.0编写的webservice客户端之间的差异

C# 用.net2.0和.net4.0编写的webservice客户端之间的差异,c#,web-services,ssl,.net-4.0,.net-2.0,C#,Web Services,Ssl,.net 4.0,.net 2.0,我在通过SSL使用java Web服务时遇到问题。 我有两种方法,一种是.net4.0,另一种是.net2.0。 不幸的是.net4.0方法不起作用。但是,早期版本(2.0)工作正常: class Program { static void Main(string[] args) { try { Srv.Service client = new Srv.Service (); X509Store st

我在通过SSL使用java Web服务时遇到问题。 我有两种方法,一种是.net4.0,另一种是.net2.0。 不幸的是.net4.0方法不起作用。但是,早期版本(2.0)工作正常:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Srv.Service client = new Srv.Service ();
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            string findValue = "IssuerName";
            X509Certificate2Collection certsCollection = store.Certificates.Find(X509FindType.FindByIssuerName, findValue, false);

            X509Certificate2 cert;
            if (certsCollection.Count > 0)
            {
                cert = certsCollection[0];
                client.ClientCertificates.Add(cert); // Only in .net 2.0
            }

            client.MethodA();

        }
        catch (Exception e)
        {
            string msg = e.Message;
        }
    }
}
之后,我在.net4.0客户端中做了类似的操作(抛出“无法为SSL/TLS建立安全通道,权限{server\u name}”异常)

class Program
{
    static void Main(string[] args)
    {
        try
        {
            Srv.ServiceClient srv = new Srv.ServiceClient();
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            string findValue = "IssuerName";
            X509Certificate2Collection certsCollection = store.Certificates.Find(X509FindType.FindByIssuerName, findValue, false);

            X509Certificate2 cert;
            if (certsCollection.Count > 0)
            {
                cert = certsCollection[0];
                srv.ClientCredentials.ClientCertificate.Certificate = new X509Certificate2();
                srv.ClientCredentials.ClientCertificate.Certificate = cert;
            }

            client.MethodA();
        }
        catch (Exception e)
        {
            string msg = e.Message;
        }
    }
}
为什么几乎相同的代码在2.0中工作,而在4.0中引发异常? 或者在第二个例子中我做错了? 重写ServicePointManager.ServerCertificateValidationCallback没有帮助

为什么我不能像在2.0框架中那样在4.0中通过add方法添加用户证书

编辑: 我没有使用IIS。我正在使用JBoss上托管的webservice

在第二个示例中,我得到以下异常:

无法为具有权限{server_name}的SSL/TLS建立安全通道


我也有同样的问题。我可以使用soapUI调用web服务: 我的解决方案-使用“添加服务引用”对话框(高级设置->添加web引用)创建web引用。
看:我也有同样的问题。我可以使用soapUI调用web服务: 我的解决方案-使用“添加服务引用”对话框(高级设置->添加web引用)创建web引用。
请参阅:和

您是否正在使用IIS。。?如果是这样,那么.NET4.0有不同的应用程序池,我几乎可以打赌2.0版的应用程序池指向的是.NET2.0框架。。我可能弄错了。我认为用于SSL的凭据和证书是两件不同的事情。我认为你是对的。但如何将客户端证书放入4.0编写的客户端?您是否使用IIS。。?如果是这样,那么.NET4.0有不同的应用程序池,我几乎可以打赌2.0版的应用程序池指向的是.NET2.0框架。。我可能弄错了。我认为用于SSL的凭据和证书是两件不同的事情。我认为你是对的。但如何将客户机证书放入4.0编写的客户机中?