ক্লায়েন্ট এসওএপি অনুরোধ প্রেরণ এবং প্রতিক্রিয়া প্রাপ্ত


159

একটি সি # ক্লায়েন্ট তৈরি করার চেষ্টা করছে (একটি উইন্ডোজ পরিষেবা হিসাবে বিকশিত হবে) যা কোনও ওয়েব পরিষেবাতে এসওএপি অনুরোধ প্রেরণ করে (এবং ফলাফলগুলি পায়)।

এই প্রশ্ন থেকে আমি এই কোডটি দেখেছি:

protected virtual WebRequest CreateRequest(ISoapMessage soapMessage)
{
    var wr = WebRequest.Create(soapMessage.Uri);
    wr.ContentType = "text/xml;charset=utf-8";
    wr.ContentLength = soapMessage.ContentXml.Length;

    wr.Headers.Add("SOAPAction", soapMessage.SoapAction);
    wr.Credentials = soapMessage.Credentials;
    wr.Method = "POST";
    wr.GetRequestStream().Write(Encoding.UTF8.GetBytes(soapMessage.ContentXml), 0, soapMessage.ContentXml.Length);

    return wr;
}

public interface ISoapMessage
{
    string Uri { get; }
    string ContentXml { get; }
    string SoapAction { get; }
    ICredentials Credentials { get; }
}

দেখতে দুর্দান্ত লাগছে, কেউ কীভাবে এটি ব্যবহার করতে জানেন এবং যদি এটি সেরা অনুশীলন হয়?

উত্তর:


224

আমি সাধারণত এটি করার জন্য অন্য উপায় ব্যবহার করি

using System.Xml;
using System.Net;
using System.IO;

public static void CallWebService()
{
    var _url = "http://xxxxxxxxx/Service1.asmx";
    var _action = "http://xxxxxxxx/Service1.asmx?op=HelloWorld";

    XmlDocument soapEnvelopeXml = CreateSoapEnvelope();
    HttpWebRequest webRequest = CreateWebRequest(_url, _action);
    InsertSoapEnvelopeIntoWebRequest(soapEnvelopeXml, webRequest);

    // begin async call to web request.
    IAsyncResult asyncResult = webRequest.BeginGetResponse(null, null);

    // suspend this thread until call is complete. You might want to
    // do something usefull here like update your UI.
    asyncResult.AsyncWaitHandle.WaitOne();

    // get the response from the completed web request.
    string soapResult;
    using (WebResponse webResponse = webRequest.EndGetResponse(asyncResult))
    {
        using (StreamReader rd = new StreamReader(webResponse.GetResponseStream()))
        {
            soapResult = rd.ReadToEnd();
        }
        Console.Write(soapResult);        
    }
}

private static HttpWebRequest CreateWebRequest(string url, string action)
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
    webRequest.Headers.Add("SOAPAction", action);
    webRequest.ContentType = "text/xml;charset=\"utf-8\"";
    webRequest.Accept = "text/xml";
    webRequest.Method = "POST";
    return webRequest;
}

private static XmlDocument CreateSoapEnvelope()
{
    XmlDocument soapEnvelopeDocument = new XmlDocument();
    soapEnvelopeDocument.LoadXml(
    @"<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" 
               xmlns:xsi=""http://www.w3.org/1999/XMLSchema-instance"" 
               xmlns:xsd=""http://www.w3.org/1999/XMLSchema"">
        <SOAP-ENV:Body>
            <HelloWorld xmlns=""http://tempuri.org/"" 
                SOAP-ENV:encodingStyle=""http://schemas.xmlsoap.org/soap/encoding/"">
                <int1 xsi:type=""xsd:integer"">12</int1>
                <int2 xsi:type=""xsd:integer"">32</int2>
            </HelloWorld>
        </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>");
    return soapEnvelopeDocument;
}

private static void InsertSoapEnvelopeIntoWebRequest(XmlDocument soapEnvelopeXml, HttpWebRequest webRequest)
{
    using (Stream stream = webRequest.GetRequestStream())
    {
        soapEnvelopeXml.Save(stream);
    }
}

1
এটি একই জিনিস, তবে আমি এসওএপি অনুরোধের স্ট্রিং সহ সবকিছু এখানে রেখেছি।
কেবিবিরাট

5
ঠিক আছে, আমি মনে করি আপনাকে এটি SOAP অনুরোধে রাখতে হবে, যদি আপনার কাছে অনুরোধ পেওলডের নমুনা থাকে, তবে আপনি ঠিক অনুরোধটি তৈরি করতে পারেন। আপনি কী ধরণের সুরক্ষা ব্যবহার করেন তা নিশ্চিত নয়, আপনি যদি ডাব্লুএস-সুরক্ষা ব্যবহার করেন তবে আপনার এসওএপি অনুরোধ শিরোনামের সাথে ব্যবহারকারীর নাম এবং পাসওয়ার্ডটি পাস করতে পারেন।
কেবিবিরাতে

3
আমি এই জাতীয় HTTPWebRequest webRequest = CreateWebRequest (_url, _action) এর মতো কিছু নিয়ে ভাবছি; webRequest.Credentials = নতুন নেটওয়ার্কক্রেডেনসিয়াল (ব্যবহারকারীর নাম, পাসওয়ার্ড, ডোমেন);
ডেটা-বেজ

3
@ হ্যামিশ: এটি কেবল একটি ধারণামূলক কোড স্নিপেট। এটিকে উত্পাদন মানের কোড হিসাবে বিবেচনা করবেন না।
KBBWrit

4
চূড়ান্ত সহায়ক এবং আমার ওয়েব পরিষেবাতে পোষ্ট ম্যানুয়াল করার জন্য টেলরিক ফিদলারের সাহায্যে আমাকে কাজ করতে সাহায্য করেছে, কারণ আপনি সেট করা সমস্ত শিরোনাম আমি দেখতে পেয়েছি। অনেক ধন্যবাদ.
রাদেবাস

64

আমি এখানে এই সহজ সমাধান পেয়েছি :

এসওএপি অনুরোধ প্রেরণ এবং ডাব্লুএসডিএল বা প্রক্সি ক্লাস ব্যবহার না করে .NET 4.0 সি # তে প্রতিক্রিয়া প্রাপ্ত:

class Program
    {
        /// <summary>
        /// Execute a Soap WebService call
        /// </summary>
        public static void Execute()
        {
            HttpWebRequest request = CreateWebRequest();
            XmlDocument soapEnvelopeXml = new XmlDocument();
            soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
                <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
                  <soap:Body>
                    <HelloWorld xmlns=""http://tempuri.org/"" />
                  </soap:Body>
                </soap:Envelope>");

            using (Stream stream = request.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }

            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                    string soapResult = rd.ReadToEnd();
                    Console.WriteLine(soapResult);
                }
            }
        }
        /// <summary>
        /// Create a soap webrequest to [Url]
        /// </summary>
        /// <returns></returns>
        public static HttpWebRequest CreateWebRequest()
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"http://localhost:56405/WebService1.asmx?op=HelloWorld");
            webRequest.Headers.Add(@"SOAP:Action");
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            return webRequest;
        }

        static void Main(string[] args)
        {
            Execute();
        }
    }

স্ট্রিং সাবান এক্সএমএল ব্যবহার করে আমরা কী সাবান এক্সএমএল ক্লায়েন্ট তৈরি করতে পারি? সি # কোড ব্যবহার করে। এর মতো: var অনুরোধ = (এইচটিপিওউবআরকিউয়েস্ট) ওয়েবআরকোয়েস্ট.ক্রিয়েট (uri); অনুরোধ.মাথোদ = সাধারণ.মাথোদ; উদাহরণস্বরূপ একটি সি # পদ্ধতি যা প্যারামিটারগুলির সাথে বিভিন্ন ডাব্লুএসডিএল পরিষেবাগুলিতে একাধিক সাবান এক্সএমএল ক্লায়েন্ট তৈরি করে।
Dvlpr

আমি নিম্নলিখিত ত্রুটি পেয়েছি এবং কোডটি সমাপ্ত হয়: 'সাবান' একটি অঘোষিত উপসর্গ। লাইন 2, অবস্থান 18. আমি কিছু মিস করছি? আমার webservice জন্য সাবান UI 'তে অনুরোধ এখানে পাওয়া যাবে: stackoverflow.com/questions/50430398/...
Vesnog

সাথে কাজ করে webRequest.Headers.Add("SOAPAction", "http://tempuri.org/.....");সাবান অ্যাকশন SoapUI মধ্যে যে পরীক্ষা করে দেখুন এবং ব্যবহার করুন।
রবার্ট কোচ

আমি SOAPAction শিরোনামে কোলনটি ব্যবহার করার সময় একটি ত্রুটি পাই। আমাকে করতে হবে: ওয়েবআরকিউয়েস্ট.ইয়েডার্স.এড (@ "এসওএপিএকশন", "সামার অ্যাকশন");
বিকাশকারী ওয়েবসাইটগুলি

কিভাবে পিডিএফ ফাইল এবং রূপান্তর প্রাপ্ত?
লিয়ান্দ্রো

20

সবচেয়ে ভাল অনুশীলন হ'ল ডাব্লুএসডিএল রেফারেন্স এবং এটি একটি ওয়েব পরিষেবা রেফারেন্সের মতো ব্যবহার করা। এটি সহজ এবং আরও ভাল কাজ করে তবে আপনার যদি ডাব্লুএসডিএল না থাকে তবে এক্সএসডি সংজ্ঞাগুলি কোডের একটি ভাল অংশ।


1
আমি কীভাবে এসওএপি অনুরোধের জন্য কাস্টম শিরোনাম যুক্ত করতে পারি যদি আমি একটি ওয়েব পরিষেবা রেফারেন্স হিসাবে ডাব্লুএসডিএল এবং শেষ পয়েন্টগুলি যুক্ত করি তবে ???
বাসার হ্যাডার জাফরি

12
আপনি এটি করার জন্য উল্লেখ করেছেন, এটি করার জন্য কোনও রেফারেন্স?
জাপানোলজিকা

যদি ডাব্লুএসডিএল একটি কাস্টম শিরোনাম চায় না, তবে আপনাকে একটি যুক্ত করা উচিত নয়।
স্টিংজি জ্যাক

1
মূলত এসওএপি প্রেরণ - প্রেরণের জন্য কী প্রয়োজন? ডাব্লুএসএইচটিপি বাইন্ডিং এবং রেফারেন্স ডাব্লুএসডিএলের মতো এসওএপি সমর্থন করে এমন বাঁধাই ব্যবহার করা কি যথেষ্ট? বাকি সমস্ত কি REST ব্যবহারের মতো (ডাব্লুসিএফ পদ্ধতিগুলি কল করা, প্রতিক্রিয়া পাওয়া)?
ফ্রেনকিবি

আমি ডাব্লুএসডিএলের সাথে একমত হয়েছি, পূর্ববর্তীটি আরও জটিল এবং অপ্রয়োজনীয়। আপনার যা যা দরকার তা হ'ল আপনার প্রকল্পের সার্ভিস রেফারেন্সগুলিতে (ভিজ্যুয়াল স্টুডিওর পুরানো সংস্করণগুলিতে) ডান ক্লিক করুন, পরিষেবা রেফারেন্স যুক্ত করুন এবং সঠিক বিশদটি ইনপুট করুন। একটি সি # অবজেক্ট তৈরি করা হয়েছে যা অবশ্যই ভেরিয়েবল হিসাবে তৈরি করা উচিত। ডাব্লুএসডিএল পরিষেবার সমস্ত কার্যকারিতা তারপরে কোডের মাধ্যমে প্রকাশ করা হবে
lllllllllllllllllll

19

আমি মনে করি একটি সহজ উপায় আছে:

 public async Task<string> CreateSoapEnvelope()
 {
      string soapString = @"<?xml version=""1.0"" encoding=""utf-8""?>
          <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
              <soap:Body>
                  <HelloWorld xmlns=""http://tempuri.org/"" />
              </soap:Body>
          </soap:Envelope>";

          HttpResponseMessage response = await PostXmlRequest("your_url_here", soapString);
          string content = await response.Content.ReadAsStringAsync();

      return content;
 }

 public static async Task<HttpResponseMessage> PostXmlRequest(string baseUrl, string xmlString)
 {
      using (var httpClient = new HttpClient())
      {
          var httpContent = new StringContent(xmlString, Encoding.UTF8, "text/xml");
          httpContent.Headers.Add("SOAPAction", "http://tempuri.org/HelloWorld");

          return await httpClient.PostAsync(baseUrl, httpContent);
       }
 }

এটি চ্যাম্পের মতো কাজ করেছিল। আমি পদ্ধতিগুলি পুনরায় ব্যবহারযোগ্য করে তোলার জন্য স্ট্রিং এক্সএমএল, পোস্ট ইউআরএল এবং অ্যাকশন ইউআরএল পাস করতে সক্ষম হওয়ার জন্য আমি ক্রিয়েটসোপ এনভেলপ পদ্ধতিতে প্যারামিটার যুক্ত করেছি এবং এটি আমি যা খুঁজছিলাম ঠিক সেটাই ছিল।
পিচ্ছিল পিট

আমার মতের সেরা উত্তর কারণ এটি অপ্রচলিত ওয়েবরেস্পনসের পরিবর্তে আরও প্রাসঙ্গিক এইচটিটিপিপ্লায়েন্ট ব্যবহার করে।
আকমল সালিখভ

15

আমি আরও সাধারণ সহায়ক শ্রেণি লিখেছিলাম যা কাস্টম প্যারামিটারগুলির একটি স্ট্রিং-ভিত্তিক অভিধান গ্রহণ করে, যাতে তারা হার্ড-কোড না করেই কলার দ্বারা সেট করা যায়। এটি বলার অপেক্ষা রাখে না যে আপনি যখন এসওএপি-ভিত্তিক ওয়েব পরিষেবাটি ম্যানুয়ালি ইস্যু করতে চান (বা প্রয়োজন) তখনই আপনার এ জাতীয় পদ্ধতিটি ব্যবহার করা উচিত: বেশিরভাগ সাধারণ পরিস্থিতিতে প্রস্তাবিত পদ্ধতিটি ওয়েব পরিষেবা ডাব্লুএসডিএলকে পরিষেবা সংস্থার রেফারেন্স ভিজ্যুয়াল স্টুডিওর সাথে একত্রে ব্যবহার করা হবে পরিবর্তে বৈশিষ্ট্য।

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Xml;

namespace Ryadel.Web.SOAP
{
    /// <summary>
    /// Helper class to send custom SOAP requests.
    /// </summary>
    public static class SOAPHelper
    {
        /// <summary>
        /// Sends a custom sync SOAP request to given URL and receive a request
        /// </summary>
        /// <param name="url">The WebService endpoint URL</param>
        /// <param name="action">The WebService action name</param>
        /// <param name="parameters">A dictionary containing the parameters in a key-value fashion</param>
        /// <param name="soapAction">The SOAPAction value, as specified in the Web Service's WSDL (or NULL to use the url parameter)</param>
        /// <param name="useSOAP12">Set this to TRUE to use the SOAP v1.2 protocol, FALSE to use the SOAP v1.1 (default)</param>
        /// <returns>A string containing the raw Web Service response</returns>
        public static string SendSOAPRequest(string url, string action, Dictionary<string, string> parameters, string soapAction = null, bool useSOAP12 = false)
        {
            // Create the SOAP envelope
            XmlDocument soapEnvelopeXml = new XmlDocument();
            var xmlStr = (useSOAP12)
                ? @"<?xml version=""1.0"" encoding=""utf-8""?>
                    <soap12:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
                      xmlns:xsd=""http://www.w3.org/2001/XMLSchema""
                      xmlns:soap12=""http://www.w3.org/2003/05/soap-envelope"">
                      <soap12:Body>
                        <{0} xmlns=""{1}"">{2}</{0}>
                      </soap12:Body>
                    </soap12:Envelope>"
                : @"<?xml version=""1.0"" encoding=""utf-8""?>
                    <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" 
                        xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" 
                        xmlns:xsd=""http://www.w3.org/2001/XMLSchema"">
                        <soap:Body>
                           <{0} xmlns=""{1}"">{2}</{0}>
                        </soap:Body>
                    </soap:Envelope>";
            string parms = string.Join(string.Empty, parameters.Select(kv => String.Format("<{0}>{1}</{0}>", kv.Key, kv.Value)).ToArray());
            var s = String.Format(xmlStr, action, new Uri(url).GetLeftPart(UriPartial.Authority) + "/", parms);
            soapEnvelopeXml.LoadXml(s);

            // Create the web request
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
            webRequest.Headers.Add("SOAPAction", soapAction ?? url);
            webRequest.ContentType = (useSOAP12) ? "application/soap+xml;charset=\"utf-8\"" : "text/xml;charset=\"utf-8\"";
            webRequest.Accept = (useSOAP12) ? "application/soap+xml" : "text/xml";
            webRequest.Method = "POST";

            // Insert SOAP envelope
            using (Stream stream = webRequest.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }

            // Send request and retrieve result
            string result;
            using (WebResponse response = webRequest.GetResponse())
            {
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                    result = rd.ReadToEnd();
                }
            }
            return result;
        }
    }
}

এই শ্রেণীর সম্পর্কিত অতিরিক্ত তথ্য এবং বিশদগুলির জন্য আপনি আমার ব্লগে এই পোস্টটি পড়তে পারেন ।


1

সুতরাং কীভাবে কোনও নামস্থান যুক্ত করতে এবং প্রক্সি / পরিষেবাদি উল্লেখ ছাড়াই এসওএপি খামের সাথে সাবান অনুরোধ করা যায় তার জন্য 2 দিন গোগল করার পরে এটি আমার চূড়ান্ত কোড is

class Request
{
    public static void Execute(string XML)
    {
        try
        {
            HttpWebRequest request = CreateWebRequest();
            XmlDocument soapEnvelopeXml = new XmlDocument();
            soapEnvelopeXml.LoadXml(AppendEnvelope(AddNamespace(XML)));

            using (Stream stream = request.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }

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

    private static HttpWebRequest CreateWebRequest()
    {
        string ICMURL = System.Configuration.ConfigurationManager.AppSettings.Get("ICMUrl");
        HttpWebRequest webRequest = null;

        try
        {
            webRequest = (HttpWebRequest)WebRequest.Create(ICMURL);
            webRequest.Headers.Add(@"SOAP:Action");
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
        return webRequest;
    }

    private static string AddNamespace(string XML)
    {
        string result = string.Empty;
        try
        {

            XmlDocument xdoc = new XmlDocument();
            xdoc.LoadXml(XML);

            XmlElement temproot = xdoc.CreateElement("ws", "Request", "http://example.com/");
            temproot.InnerXml = xdoc.DocumentElement.InnerXml;
            result = temproot.OuterXml;

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }

        return result;
    }

    private static string AppendEnvelope(string data)
    {
        string head= @"<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" ><soapenv:Header/><soapenv:Body>";
        string end = @"</soapenv:Body></soapenv:Envelope>";
        return head + data + end;
    }
}

-5

সি # তে এসওএপি ওয়েবসার্ভিস কল করুন

using (var client = new UpdatedOutlookServiceReferenceAPI.OutlookServiceSoapClient("OutlookServiceSoap"))
{
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;
    var result = client.UploadAttachmentBase64(GUID, FinalFileName, fileURL);

    if (result == true)
    {
        resultFlag = true;
    }
    else
    {
        resultFlag = false;
    }
    LogWriter.LogWrite1("resultFlag : " + resultFlag);
}

3
কী new UpdatedOutlookServiceReferenceAPI.OutlookServiceSoapClient()?
ক্রিস এফ ক্যারল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.