使用PFX证书C#发送HttpWebRequest

本文关键字:发送 HttpWebRequest 证书 PFX 使用 | 更新日期: 2023-09-27 18:23:46

我一直在尝试发送一个Web请求,但在req上遇到了这个错误"远程服务器返回了一个错误:(500)内部服务器错误。"。GetResponse();

我真的不知道是缺少什么还是出了什么问题。

有人能帮我吗?

string soap = "<?xml version='1.0'?> " +
    "soapenv:Envelope xmlns:ns='http://www.buzonfiscal.com/ns/xsd/bf/bfcorp/32' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> " + 
    "<soapenv:Header/> " +
    "<soapenv:Body> " +
    "<ns:RequestCancelaCFDi uuid='" + this.txtUUID.Text + "' rfcReceptor='" + this.txtReceptor.Text + "' rfcEmisor='" + this.txtEmisor.Text + "'/> " +
    "</soapenv:Body> " +
    "</soapenv:Envelope> ";
        X509Certificate2 cert = new X509Certificate2(@"C:'test.pfx", "password");
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://WebRequest.com/bfcorpcfdi32ws");
        req.ContentType = "text/xml";
        req.Method = "POST";
        req.ClientCertificates.Add(cert);
       // MessageBox.Show(soap);
        using (Stream stm = req.GetRequestStream())
        {
            using (StreamWriter stmw = new StreamWriter(stm))
            {
                stmw.Write(soap);
                stmw.Close();
            }
        }
        WebResponse response = req.GetResponse();
        Stream responseStream = response.GetResponseStream();
        response = req.GetResponse();
        StreamReader sr = new StreamReader(response.GetResponseStream());
        string result = sr.ReadToEnd();
        sr.Close();

使用PFX证书C#发送HttpWebRequest

我不知道怎么回事,但这段代码运行得很好。

string soap = "<?xml version='1.0'?> " +
                        "<soapenv:Envelope xmlns:ns='http://www.buzonfiscal.com/ns/xsd/bf/bfcorp/32' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> " +
                        "<soapenv:Header/> " +
                        "<soapenv:Body> " +
                        "<ns:RequestCancelaCFDi uuid='" + this.txtUUID.Text + "' rfcReceptor='" + this.txtReceptor.Text + "' rfcEmisor='" + this.txtEmisor.Text + "'/> " +
                        "</soapenv:Body> " +
                        "</soapenv:Envelope> ";
        X509Certificate2 cert = new X509Certificate2(@"C:'test.pfx", "password");
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://WebRequest.com/bfcorpcfdi32ws");
        req.ContentType = "text/xml";
        req.Method = "POST";
        req.ClientCertificates.Add(cert);
        MessageBox.Show(soap);
        using (Stream stm = req.GetRequestStream())
        {
            using (StreamWriter stmw = new StreamWriter(stm))
            {
                stmw.Write(soap);
                stmw.Close();
            }
        }
        try
        {
            WebResponse response = req.GetResponse();
            Stream responseStream = response.GetResponseStream();
            response = req.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream());
            string result = sr.ReadToEnd();
            sr.Close();
        }
        catch (Exception ex)
        {
            if (ex is WebException)
            {
                WebException we = ex as WebException;
                WebResponse webResponse = we.Response;
                throw new Exception(ex.Message);
            }
        }

发送到服务器的XML中似乎有错误。你的第一行应该是这样的:

string soap = "<?xml version='1.0'?> " +
"<soapenv:Envelope xmlns:ns='http://www.buzonfiscal.com/ns/xsd/bf/bfcorp/32' xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> " + 
"<soapenv:Header/> " +
"<soapenv:Body> " +
"<ns:RequestCancelaCFDi uuid='" + this.txtUUID.Text + "' rfcReceptor='" + this.txtReceptor.Text + "' rfcEmisor='" + this.txtEmisor.Text + "'/> " +
"</soapenv:Body> " +
"</soapenv:Envelope> ";

您还应该小心,并避开您正在设置的值。虽然稍微详细一点,但使用XDocument、XElement和XAttribute可能有助于确保您拥有一个有效的文档。

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
XNamespace ns = "http://www.buzonfiscal.com/ns/xsd/bf/bfcorp/32";
var doc = new XDocument(
    new XElement(soapenv + "Envelope",
        new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
        new XAttribute(XNamespace.Xmlns + "ns", ns),
        new XElement(soapenv + "Header"),
        new XElement(ns + "RequestCancelaCFDi",
            new XAttribute("uuid", this.txtUUID.Text),
            new XAttribute("rfcReceptor", this.txtReceptor.Text),
            new XAttribute("rfcEmisor", this.txtEmisor.Text)
            )
        )
    );
var builder = new StringBuilder();
using (var writer = new StringWriter(builder))
{
    doc.Save(writer);
}
string soap = builder.ToString();