2010-07-22 3 views
3

Я использую этот код из C# для вызова PHP веб-сервис, который крепится с помощью пользователя/пароля и сертификата:Вызов PHP WebService из .net с серт

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(); 

Это работает, как ожидалось при запуске с моей машины разработки, но когда мы загружаем это на сервер, я получаю ошибку Timeout при вызове GetResponse().

Вызов AttachCert() - это то место, где я прикрепляю сертификат к запросу, и, если я прокомментирую эту строку, я не получаю таймаут, но правильная ошибка, говорящая, что вызов не может быть завершен из-за недостающего сертификата. Это код 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); 
} 

Любая идея, почему это будет работать на моей машине, но не на сервере? Мы попытались удалить сертификат в веб-сервисе, и он работал, как ожидалось. Поэтому в этом вызове есть что-то странное, но я не могу понять, что.

Благодаря Vicenç

+0

Можете ли вы проследить в AttachCert и посмотреть, какой вызов внутри вызывает таймаут? – TML

+0

Я видел проблемы с брандмауэрами между разработчиком и производителем. Можете ли вы RDP на производственный сервер и подтвердить, что можете просматривать веб-службу PHP с помощью IE? –

+0

Почему вы используете как базовую аутентификацию, так и сертификат? –

ответ

1

Try регистрации этого обратного вызова и наблюдать за любые ошибки.

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); 

Надеюсь, это поможет.

Смежные вопросы