通过SSL(https)的简单HttpWebRequest在C#下找不到404

时间:2009-04-20 12:22:38

标签: .net-3.5 ssl httpwebrequest

我想对一个位于安全连接上的php编写的Web服务进行POST。以下代码只是我经过几个小时的试验和错误后编写的测试控制台应用程序。基本上,我发现了一些使用HttpWebRequest的不同方法,但它们都是相同的。

在Web浏览器上使用“http”测试我的URI,应该返回一个空白的html(带有空体)。这可以在浏览器和我的代码中正常使用。

我继续尝试了http://www.google.com,我得到了谷歌...(正如预期的那样)。 当我将URI从http更改为https时出现问题。 在网络浏览器上使用“https”测试我的URI,返回相同的空白html(这是预期的)。 但是当我在代码中尝试相同的URI时,我得到了404 Not Found。

这是简单的代码(和URI)(取消注释第二个尝试https):

try
{
  string lcUrl = "http://servicios.mensario.com/enviomasivo/apip/";
  //string lcUrl = "https://servicios.mensario.com/enviomasivo/apip/";

  // *** Establish the request
  HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl);

  // *** Set properties
  loHttp.Timeout = 10000;     // 10 secs
  loHttp.Method = "POST"; // I added this for testing, but using GET or commenting this out doesn't change anything.

  // Retrieve request info headers ******** HERE I GET THE EXCEPTION **********
  HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

  // All this code only works when lcUrl is NOT https.
  Encoding enc = Encoding.GetEncoding(1252);  // Windows default Code Page

  StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);

  string lcHtml = loResponseStream.ReadToEnd();

  loWebResponse.Close();
  loResponseStream.Close();
}
catch ( WebException ex )
{
  if ( ex.Status == WebExceptionStatus.ProtocolError )
  {
    HttpWebResponse response = ex.Response as HttpWebResponse;
    if ( response != null )
    {
      // Process response
      Console.WriteLine(ex.ToString());
    }
  }
}
Console.Read();
return;

例外是:

  

System.Net.WebException:远程服务器返回错误:(404)Not Found。在   System.Net.HttpWebRequest.GetResponse()

注意:此处显示的http网址是我必须使用的真实网址,它不属于我,而属于另一家公司。

如果响应正常,则这是lcHtml应包含的内容:

<html>
<head>
 <title></title>
</head>

<body>
</body>
</html>

由于我在发布此问题之前用Google搜索并 StackOverflowed 很多,我发现了一些想法。一种是添加“忽略证书”代码:

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate( object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors )
  {
      return true; // **** Always accept
  };

这似乎没有任何改变。

其他用户说SSL协议类型可能有误......所以我尝试使用这两种方法无济于事:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

有什么想法吗?

更新 我回去创建了一个简单的控制台应用程序。 代码是这样的:

WebRequest req = WebRequest.Create("http://servicios.mensario.com/enviomasivo/apip/");
WebResponse resp = req.GetResponse();

有效。没错。

但是,如果我将URI更改为https:

WebRequest req = WebRequest.Create("https://servicios.mensario.com/enviomasivo/apip/");
WebResponse resp = req.GetResponse();

我收到错误(继续尝试)。

然而 this php代码似乎有效。我看到的唯一相关代码行是:

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

西班牙语的评论说:“有了这个,我们可以忽略SSL证书。”

我认为这是关键。但是

System.Net.ServicePointManager.ServerCertificateValidationCallback…

...东西,似乎没有同样的效果。

提前致谢。

3 个答案:

答案 0 :(得分:10)

使用fiddler和firefox进行一些实验后,您的网址似乎就成了问题。对我来说,这给出了404:

https://servicios.mensario.com/enviomasivo/apip/

而这不是:

https://servicios.mensario.com/enviomasivo/apip

注意,结尾斜杠。此外,您发布的php示例也没有结尾斜杠。

答案 1 :(得分:0)

您可以尝试这里描述的技巧: http://oregonstate.edu/~reeset/blog/archives/166

答案 2 :(得分:0)

这看起来不像是代码的问题,因为您提供的URL似乎仍然具有有效的SSL证书。

尝试使用“https://www.google.com”的两行代码段,因此我建议设置一个像Fiddler这样的Web调试代理,以便在servicios上使用HTTP和HTTPS时比较HTTP请求字段.www.mensario.com/enviomasivo/ APIP。您在该网站上使用反向代理吗?