2010-07-22 4 views
3

J'utilise ce code de C# pour appeler un service web php qui est garanti par l'utilisateur/mot de passe et certificat:Appeler un webservice php de .net avec un cert

string wsurl = ConfigurationManager.AppSettings["Url"]; 
string wsuser = ConfigurationManager.AppSettings["User"]; 
string wspass = ConfigurationManager.AppSettings["Pass"]; 

string url = string.Format(wsurl, param1, param2); 

System.Net.CredentialCache oCredentialCache = new System.Net.CredentialCache(); 
oCredentialCache.Add(new System.Uri(url), "Basic", 
    new System.Net.NetworkCredential(wsuser, wspass)); 

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); 
req.Timeout = TIMEOUT; 
req.Credentials = oCredentialCache; 
req.Method = "GET"; 

AttachCert(req); 

//Get the data as an HttpWebResponse object 
WebResponse resp = req.GetResponse(); 

Cela fonctionne comme prévu lors de son exécution de ma machine de développement mais quand nous téléchargeons ceci au serveur j'obtiens une erreur de délai d'attente sur l'appel à GetResponse(). L'appel AttachCert() est où j'attache le certificat à la demande, et si je commente cette ligne je n'obtiens pas le délai d'attente mais une erreur correcte indiquant que l'appel n'a pas pu être accompli en raison du certificat manquant. Ce est le code AttachCert:

public static void AttachCert(HttpWebRequest Request) 
{ 
    // Obtain the certificate. 
    string certpath = ConfigurationManager.AppSettings["CertPath"]; 

    X509Certificate Cert = X509Certificate.CreateFromCertFile(certpath); 
    ServicePointManager.CertificatePolicy = new CertPolicy(); 

    Request.ClientCertificates.Add(Cert); 
} 

Toute idée pourquoi cela fonctionnerait sur ma machine, mais pas sur le serveur? Nous avons essayé de supprimer le certificat sur le webservice et cela a fonctionné comme prévu. Donc, il y a clairement quelque chose d'étrange sur cet appel mais je n'arrive pas à comprendre quoi.

Merci Vicenç

+0

Pouvez-vous tracer dans AttachCert et voir quel appel à l'intérieur provoque le timeout? – TML

+0

J'ai vu des problèmes avec les firewalls entre dev et production. Pouvez-vous RDP sur le serveur de production et confirmer que vous pouvez naviguer vers le service Web PHP avec IE? –

+0

Pourquoi utilisez-vous à la fois l'authentification de base et la fourniture d'un certificat? –

Répondre

1

Essayez de vous enregistrer ce rappel et surveiller toute erreur.

public static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) { 
    // check for errors 
    // just return true to accept any certificate (self signed etc) 
} 

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(MyClass.ValidateRemoteCertificate); 

J'espère que cela aide.