سؤال

أحاول إنشاء رسالة صابون (بما في ذلك الرأس) في C# .NET لإرسالها إلى عنوان URL باستخدام POST HTTP. عنوان URL الذي أرغب في إرساله إليه ليس خدمة ويب ، إنه يتلقى رسائل الصابون فقط لاستخراج المعلومات منه في النهاية. أي أفكار حول كيفية القيام بذلك؟

هل كانت مفيدة؟

المحلول

تحتاج أولاً إلى إنشاء XML صالح. أستخدم LINQ إلى 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
                    }
                }
            }

نصائح أخرى

كان رمزك أعلاه يفتقد بين قوسين وكان لديه فاصلة إضافية ، لقد قمت بإصلاحه هنا:

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") 
            ) 
        ) 
    )
); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top