c# 使用 509 证书签署 SOAP 信封网络请求

c# Sign a SOAP envelope webrequest with a 509 cert

我正在与拒绝修复其已发布 WSDL 方案的第三方合作。问题是 SOAP 服务期望的名称空间与 WSDL 提供的名称空间不同。所以在我的 C# 应用程序中,我在使用 .Net 代理时遇到了很多麻烦。为了解决这个问题,我只想发送一个 web-request 并打包我的数据

我只是不知道如何将我的签名添加到我的请求的 header 中。

 Microsoft.Web.Services3.SoapEnvelope soapEnvelopeXml = new Microsoft.Web.Services3.SoapEnvelope();

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://Illinois-stage.tylerhost.net/efm/FilingReviewMDEPort.svc");
            request.Headers.Add("SOAPAction:\"urn:oasis:names:tc:legalxml-courtfiling:wsdl:WebServicesProfile-Definitions-4.0/FilingReviewMDEPort/ReviewFilingRequest\"");
            request.Headers.Add("Accept-Encoding: gzip, deflate");
            request.KeepAlive = true;
            request.Headers.Add("MIME-Version: 1.0");
            request.ContentType = "multipart/related; type=\"application/xop+xml\";start=\"<http://tempuri.org/0>\";boundary=\"uuid:936f2c7e-590a-4f19-b154-ce8285adf18a+id=2\";start-info=\"text/xml\"";
            request.Method = "POST";

            soapEnvelopeXml.Load(@"c:\temp\ReviewFilingRequest.xml");

            System.IdentityModel.Tokens.X509SecurityToken securityToken = new System.IdentityModel.Tokens.X509SecurityToken(X509);
            Microsoft.Web.Services3.Security.Tokens.X509SecurityToken signatureToken   = new Microsoft.Web.Services3.Security.Tokens.X509SecurityToken(X509);

            MessageSignature sig = new MessageSignature(signatureToken);

            ////////// XmlDocumentFragment xfrag = soapEnvelopeXml.CreateDocumentFragment();
            //////////xfrag.InnerXml = messageHeader;
            //////////soapEnvelopeXml.DocumentElement.FirstChild.AppendChild(xfrag);

            XmlDocument xmlDoc = new XmlDocument();
            MemoryStream xmlStream = new MemoryStream();
            xmlDoc.Save(xmlStream);

            using (var writer = XmlDictionaryWriter.CreateMtomWriter(xmlStream, Encoding.UTF8, int.MaxValue, "text/xml", "uuid:936f2c7e-590a-4f19-b154-ce8285adf18a+id=2", "http://tempuri.org/0",false,false))
            {
                soapEnvelopeXml.WriteTo(writer);
                using (Stream stream = request.GetRequestStream())
                {
                    stream.Write(xmlStream.ToArray(),0, xmlStream.ToArray().Length );
                }
            }

            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                      string soapResult = rd.ReadToEnd();
                      Console.WriteLine(soapResult);
                }
            }

一些可能会有所帮助的事情。

  1. 您收到什么错误消息?访问被拒绝(或类似的东西)?

  2. 您是否尝试查看缺少的 headers?执行此操作的最佳方法是下载允许 HTTPS 解密的 WireShark 或 Telerik 的 Fiddler。使用其中之一,您可以在 Internet 浏览器中访问网站并查看通过普通浏览器发送的 headers。

我最终签署了它 Node.js 切换到 node 让我对消息有了更多的控制。作为额外的好处,我不必支付微软税。

https://www.npmjs.com/search?q=soap&page=1&ranking=optimal