Ответ 1
После некоторого исследования я нашел запись в блоге Jan Tielens, в которой объясняется, что происходит, и обходной путь для моей проблемы:
Когда вы переходите на сайт HTTPS, вы, вероятно, получите диалоговое окно с запросом, хотите ли вы доверять сертификату, предоставленному веб-сервером. Таким образом, ответственность за принятие сертификата обрабатывается пользователем. Вернитесь к сценарию webservice, если вы хотите вызвать веб-сервис, расположенный на веб-сервере, который использует SSL и HTTPS, существует проблема. Когда вы вызываете код из кода, диалоговое окно не появляется, и вы спрашиваете, доверяете ли вы сертификату (к счастью, потому что это было бы довольно уродливым в сценариях на стороне сервера); вероятно, вы получите следующее исключение:
Необработанное исключение типа
System.Net.WebException
произошло в System.dll
Дополнительная информация: соединение было закрыто: не удалось установить доверительные отношения с удаленный сервер.Но есть решение для этого проблемы, вы можете решить это в своем кода, создав собственный
CertificatePolicy
класс (который реализуетICertificatePolicy
интерфейс). В этом классе вы будете придется писать свои собственныеCheckValidationResult
, которая должен возвращатьtrue
илиfalse
, как вы нажмите да или нет в диалоговом окне окно. В целях развития я создал следующий класс, который принимает все сертификаты, поэтому вы не будете получить неприятныйWebException
больше:
public class TrustAllCertificatePolicy : System.Net.ICertificatePolicy
{
public TrustAllCertificatePolicy() { }
public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
{
return true;
}
}
Как вы можете видеть
CheckValidationResult
функция всегда возвращает true, поэтому все сертификаты будут быть доверенным. Если вы хотите сделать это класс немного более безопасен, вы может добавить дополнительные проверки, используяX509Certificate
, например. Чтобы использовать этотCertificatePolicy
, вы должны сообщитьServicePointManager
использовать его:
System.Net.ServicePointManager.CertificatePolicy = new TrustAllCertificatePolicy();
Это должно быть сделано (один раз в течение жизненного цикла приложения), прежде чем вызов вашего веб-сервиса.