C# .NET 中通过 HTTP post 的 SOAP 对象

发布于 2024-08-12 22:05:10 字数 124 浏览 10 评论 0原文

我正在尝试在 C# .NET 中编写 SOAP 消息(包括标头)以使用 HTTP post 发送到 URL。我想要将其发送到的 URL 不是 Web 服务,它只是接收 SOAP 消息以最终从中提取信息。关于如何做到这一点有什么想法吗?

I am trying to compose a SOAP message(including header) in C# .NET to send to a URL using HTTP post. The URL I want to send it to is not a web-service, it just receives SOAP messages to eventually extract information from it. Any ideas on how to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

吖咩 2024-08-19 22:05:10

首先您需要创建一个有效的 XML。我使用 Linq to XML 来实现此目的,如下所示:

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
var document = new XDocument(
               new XDeclaration("1.0", "utf-8", String.Empty),
               new XElement(soapenv + "Envelope",
                   new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
                   new XElement(soapenv + "Header",
                       new XElement(soapenv + "AnyOptionalHeader",
                           new XAttribute("AnyOptionalAttribute", "false"),
                       )
                   ),
                   new XElement(soapenv + "Body",
                       new XElement(soapenv + "MyMethodName",
                            new XAttribute("AnyAttributeOrElement", "Whatever")
                       )
                   )
                );

然后我使用(编辑:在此处添加 XDocument.ToString() 来发送它。)

            var req = WebRequest.Create(uri);
            req.Timeout = 300000;  //timeout
            req.Method = "POST";
            req.ContentType = "text/xml;charset=UTF-8";

            using (var writer = new StreamWriter(req.GetRequestStream()))
            {
                writer.WriteLine(document.ToString());
                writer.Close();
            }

如果我必须阅读一些内容回应,我愿意(这是上述代码的后续):

            using (var rsp = req.GetResponse())
            {
                req.GetRequestStream().Close();
                if (rsp != null)
                {
                    using (var answerReader = 
                                new StreamReader(rsp.GetResponseStream()))
                    {
                        var readString = answerReader.ReadToEnd();
                        //do whatever you want with it
                    }
                }
            }

First you need to create a valid XML. I use Linq to XML to achieve this, like follow:

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
var document = new XDocument(
               new XDeclaration("1.0", "utf-8", String.Empty),
               new XElement(soapenv + "Envelope",
                   new XAttribute(XNamespace.Xmlns + "soapenv", soapenv),
                   new XElement(soapenv + "Header",
                       new XElement(soapenv + "AnyOptionalHeader",
                           new XAttribute("AnyOptionalAttribute", "false"),
                       )
                   ),
                   new XElement(soapenv + "Body",
                       new XElement(soapenv + "MyMethodName",
                            new XAttribute("AnyAttributeOrElement", "Whatever")
                       )
                   )
                );

Then I send it using (EDIT: added XDocument.ToString() down here.)

            var req = WebRequest.Create(uri);
            req.Timeout = 300000;  //timeout
            req.Method = "POST";
            req.ContentType = "text/xml;charset=UTF-8";

            using (var writer = new StreamWriter(req.GetRequestStream()))
            {
                writer.WriteLine(document.ToString());
                writer.Close();
            }

If I have to read some response, I do (this is followup of the above code):

            using (var rsp = req.GetResponse())
            {
                req.GetRequestStream().Close();
                if (rsp != null)
                {
                    using (var answerReader = 
                                new StreamReader(rsp.GetResponseStream()))
                    {
                        var readString = answerReader.ReadToEnd();
                        //do whatever you want with it
                    }
                }
            }
掀纱窥君容 2024-08-19 22:05:10

您上面的代码缺少括号并有一个额外的逗号,我在这里修复了它:

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/"; 
var document = new XDocument( 
    new XDeclaration("1.0", "utf-8", String.Empty), 
    new XElement(soapenv + "Envelope", 
        new XAttribute(XNamespace.Xmlns + "soapenv", soapenv), 
        new XElement(soapenv + "Header", 
            new XElement(soapenv + "AnyOptionalHeader", 
                new XAttribute("AnyOptionalAttribute", "false")
            ) 
        ), 
        new XElement(soapenv + "Body", 
            new XElement(soapenv + "MyMethodName", 
                new XAttribute("AnyAttributeOrElement", "Whatever") 
            ) 
        ) 
    )
); 

your code above was missing a parenthesis and had an extra comma, i fixed it here:

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/"; 
var document = new XDocument( 
    new XDeclaration("1.0", "utf-8", String.Empty), 
    new XElement(soapenv + "Envelope", 
        new XAttribute(XNamespace.Xmlns + "soapenv", soapenv), 
        new XElement(soapenv + "Header", 
            new XElement(soapenv + "AnyOptionalHeader", 
                new XAttribute("AnyOptionalAttribute", "false")
            ) 
        ), 
        new XElement(soapenv + "Body", 
            new XElement(soapenv + "MyMethodName", 
                new XAttribute("AnyAttributeOrElement", "Whatever") 
            ) 
        ) 
    )
); 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文