2012-09-21 81 views
1

我刚从Ubuntu软件中心安装monodevelop并创建了一个解决方案。我正在尝试做WebRequest.create(url)。但它一直在抛出“验证或解密失败”。我究竟做错了什么?如果我没有做错什么,我应该怎么做才能做到上述工作!遇到monodevelop问题

我已经搜索这个,但我不能拿出一个解决方案,将解决我的问题!

这里是我做什么...

public static string AccessURL(string url, string postcontent) 
    { 
     WebRequest request = WebRequest.Create(url); 
     request.Method = "POST"; 
     byte[] byteArray = Encoding.UTF8.GetBytes(postcontent); 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.ContentLength = byteArray.Length; 
     Stream dataStream = request.GetRequestStream(); 
     dataStream.Write(byteArray, 0, byteArray.Length); 
     dataStream.Close(); 
     WebResponse response = request.GetResponse(); 
     dataStream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(dataStream); 
     string responseFromServer = reader.ReadToEnd(); 
     reader.Close(); 
     dataStream.Close(); 
     response.Close(); 
     return responseFromServer; 
    } 

提前感谢!

+0

你可以发布你到目前为止的代码,这证明了这个问题吗? – simonc

+0

您是否正在访问“https”网站? – Cheesebaron

+1

我同时访问https和http – seeker

回答

4

错误表明您试图访问一个SSL/TLS加密的资源。 Mono不以任何默认信任任何这些网站,并由开发人员决定是否要访问该资源。更多关于此的在mono's security FAQ

因此,要做到这一点的方法之一是实现在类中ServerCertificateValidationCallback:

using System.IO; 
using System.Net; 
using System.Net.Security; 
using System.Security.Cryptography.X509Certificates; 
using System.Text; 

public class MyAwesomeProgram 
{ 
    public MyAwesomeProgram() 
    { 
     ServicePointManager.ServerCertificateValidationCallback = 
       ValidateServerCertficate; 
    } 

    private static bool ValidateServerCertficate(object sender, X509Certificate certificate, 
     X509Chain chain, SslPolicyErrors sslpolicyerrors) 
    { 
     //This is where you should validate the remote certificate 
     return true; 
    } 

    public void FetchAwesomeStuff (string url) 
    { 
     var wr = WebRequest.Create (url); 
     var stream = wr.GetResponse().GetResponseStream(); 
     Console.WriteLine (new StreamReader (stream).ReadToEnd()); 
    } 
} 

有在mono documentation about using Certificate Policies and Trusting Roots更多的例子。 注意事项上面的示例忽略了安全性并接受所有证书,即使那些您可能不信任的证书。这不建议使用!

+0

它说ServicePointManager已经过时。使用ServerCertificateValidationCallback。如果我用它说它在当前上下文中不存在! – seeker

+0

刚刚更新我的答案,而不是使用ServerCertificateValidationCallback。 – Cheesebaron

+0

非常感谢你,现在我工作得很好!这会同时用于http和https呼叫吗? – seeker