2

我最初使用 WebRequest 和 WebResponse 来发送 Http Post 消息。我总是得到“OK”的回应。我发布的消息是使用 xml 中的证书签名的 XML。

组成如下:发送到 https 网站的 C# 服务。HTTPS 网站在另一个我不能说的地方。HTTPS 本地网站,它只是接收我在本地发布的消息并将结果写入文件。只是为了模拟其他网站正在获得什么。

本地网站使用自签名证书签名,将于 2048 年到期。

直到本周,这段代码都运行良好。我总是张贴并得到一个好的。在这两个网站上。但本周测试和真正的项目实施都进入了 Kaput。在两个网站上。
在本地网站上,它说无法连接到 SSL。这个问题是由自签名证书引起的,由于某种原因超出了我的理解,它给了地狱。感谢这里的问题,我刚刚验证了证书始终是真实的,现在它不再有问题了。

要解决此问题,只需编写以下代码:

ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();

在您的应用程序开始时。所以它只运行一次。

剩下的问题是“远程服务器返回错误:(503)服务器不可用。”。我在浏览器中输入 URL,它对我来说很好。在该网站的代码中没有收到任何内容,当它进入网络响应时,它给了我上述错误

我做了一个仅发送“Testing 1 2 3”的测试应用程序,但我不断收到错误消息。我也将它发送到哈佛 https 网站,没有错误。

private void btnSend_Click(object sender, EventArgs e)
    {
        try
        {
            WebRequest req = WebRequest.Create(cboUrl.Text);
            req.PreAuthenticate = true;
            req.UseDefaultCredentials = true;
            req.Method = "POST";
            req.ContentType = "text/xml";
            String msg = txtMsg.Text;

            using (Stream s = req.GetRequestStream())
            {
                try
                {
                    s.Write(
                        System.Text.ASCIIEncoding.ASCII.GetBytes(msg), 0, msg.Length);
                }
                finally
                {
                    s.Close();
                }
            }

            WebResponse resp = req.GetResponse();
            StreamReader str = new StreamReader(resp.GetResponseStream());

            txtRes.Text = str.ReadToEnd();
        }
        catch (WebException ex)
        {
            txtRes.Text = ex.Message;
        }
        catch (Exception ex)
        {
            txtRes.Text = ex.Message;
        }

    }

这是我从网上找到的另一个例子:

private void button1_Click(object sender, EventArgs e)
    {
        try
        {

            HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(cboUrl.Text);
            myReq.Headers.Clear();
            myReq.Method = "POST";
            myReq.KeepAlive = false;
            myReq.ProtocolVersion = HttpVersion.Version11;
            myReq.ContentType = "text/xml";
            myReq.Proxy = null;
            myReq.Credentials = null;
            myReq.ContentLength = txtMsg.Text.Length;
            using (StreamWriter sendingData = new StreamWriter(myReq.GetRequestStream()))
            {
                sendingData.Write(txtMsg.Text);
                sendingData.Flush();
                sendingData.Close();
            }

            HttpWebResponse myResponse = (HttpWebResponse) myReq.GetResponse();
            StreamReader responseStream = new StreamReader(myResponse.GetResponseStream());
            txtRes.Text = responseStream.ReadToEnd();

            responseStream.Close();
            myResponse.Close();

        }
        catch(WebException ex )
        {
            txtRes.Text = ex.Message;
        }
        catch (Exception ex)
        {
            txtRes.Text = ex.Message;
        }


    }

更新

错误是我用 httpwebrequest 调用的那个需要一些我没有提供的 httpheaders。在唯一发生的事情是我得到“OK”响应之前。他们修复了他们的代码,我修复了我的代码,现在它可以工作了。

如果它发生在其他人身上,请像下面所说的那样检查代理设置,并检查另一方是否给出异常或什么都不返回。

4

5 回答 5

4

如果您在浏览器中导航到 URL 时没有收到 503 错误,但在使用 HttpWebRequest 请求资源时确实收到了它,那么我建议的第一件事是在发出请求时为UserAgent指定一个值。

您可能还想使用Fiddler2或其他工具来更好地了解请求生命周期内发生的情况。如果不了解您发布消息的服务的详细信息,就很难提供指导。

于 2008-11-19T22:45:08.940 回答
2

我有一个类似的问题。感谢 Fiddler 提示,我发现它是由我的新开发环境中的代理设置引起的。很烦人。.NET 网络服务采用 IE 中设置的代理设置。

有关详细信息,请查看: http: //support.microsoft.com/kb/307220http://msdn.microsoft.com/en-us/library/kd3cf2ex.aspx

于 2009-07-16T09:20:22.857 回答
1

问题似乎是这个网站改变了。之前,如果我发送带有任何垃圾的消息,它会返回通常的 OK。他们更改了网站,并且需要一些 http 标头。昨天我一整天都在使用 http 标头,而晚上则是它起作用的时候。在我的情况下,它期待 http 标头而不是获取它们,也许某些东西正在爆炸。

我今天对它进行了测试,给出了标题而不是给出了 http 标题,在后一种情况下它做了 503。

如果我找到更多信息,我会尝试在此处发布。我希望这可以为其他人节省一些时间和一些头发:)。

于 2008-11-20T21:44:44.523 回答
1

我有 503 错误的类似问题,但原因是代理。如果你有代理,只需使用这个:

request.Proxy = null;

request.Credentials = System.Net.CredentialCache.DefaultCredentials;

于 2013-04-05T11:02:42.700 回答
1

如果您重置 IIS,请确保您最近没有更改密码。愚蠢,但它发生了。

于 2013-05-31T20:45:17.187 回答