فراخوانی Web Service با استفاده از SOAP Request

چهارشنبه 3 شهریور 1395

در این مقاله ، نحوه ارسال یک درخواست به صورت Post به یک وب سرویس با استفاده از SOAP و سپس گرفتن پاسخ از آن را خواهیم آموخت.

فراخوانی Web Service با استفاده از SOAP Request

امروزه سرویس های زیادی مانند WCF, REST, Web API و ... در دسترس هستند. اما هنوز Web Service ها نقش مهمی در ایجاد ارتباط بین برنامه های چندسکویی (cross platform) ایفا می کنند و اطلاعات را از یک برنامه به سایر برنامه ها منتقل می کنند.

ما در این مقاله از یک وب سرویس از پیش ساخته شده استفاده می کنیم و به همین دلیل، دیگر مراحل ساخت وب سرویس را توضیح نمی دهیم. فقط به نحوه فراخوانی وب سرویس با استفاده از SOAP request می پردازیم.

گام اول: بدنه Web Service SOAP Request را پیدا کنید.

ما یک وب سرویس داریم که بر روی IIS محلی ما host شده است . بنابراین آدرس وب سرویس را در مرورگر وارد کنید و سپس صبر کنید تا صفحه زیر برای شما نمایش داده شود:

همان طور که در تصویر بالا می بینید، دو متد در وب سرویس ما وجود دارد. بر روی یکی از متدها (مثلا Sum) کلیک کنید. با این کار، تصویر زیر برای شما نمایش داده خواهد شد.

در تصویر بالا، مشاهده می کنیم که همه جزئیات ایجاد یک درخواست SOAP  و همچنین مقادیر پارامتر مورد نیاز برای invoke   کردن HttpWebRequest  ها نشان داده شده اند . بنابراین، بیایید مرور کوتاهی  بر این پارامترها انجام بدهیم.

HTTP Method : بیان کننده نوع درخواست HTTP است که می خواهید از سرویس ، درخواست کنید. مانند GET , POST ,PUT  و یا  delete.

Host : آدرس مکانی که سرویس بر روی آن host شده است را نشان می دهد. که در این مقاله localhost است. به عنوان مثال : http://localhost/Employee.asmx

Content-Type : بیان کننده نوع درخواستی است که شما از سرویس انجام می دهید ، مانند XML  و یا  json.که در این مقاله text/xml است.

Content-Length : بیان کننده طول بدنه request شما است .

SOAPAction : این پارامتر، یک صفت بسیار مهم برای شناسایی web method و فراخوانی آن از چندین web method است.

SOAP Body : بدنه درخواست و پاسخ را مشخص می کند.

امیدواریم که با این توضیحات، پارامترها برای شما آسان تر شده باشند.

گام دوم: یک برنامه Console ایجاد کنید تا وب سرویس را از طریق آن فراخوانی کنید.

1-به آدرس "Start", "All Programsبروید و  "Microsoft Visual Studio 2015" را باز کنید.

2-بر روی "File", "New",  و سپس  "Project..." کلیک کرده و یک برنامه Console  باز کنید.

3-یک نام برای پروژه انتخاب کنید و مکان ذخیره سازی آن را نیز مطابق با دلخواه خودتان تغییر بدهید.

حالا فایل Program.cs را باز کنید و متد زیر را برای ایجاد HttpWebRequest بنویسید:

public HttpWebRequest CreateSOAPWebRequest()    
    {    
        //Making Web Request    
        HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(@"http://localhost/Employee.asmx");    
        //SOAPAction    
        Req.Headers.Add(@"SOAPAction:http://tempuri.org/Addition");    
        //Content_type    
        Req.ContentType = "text/xml;charset=\"utf-8\"";    
        Req.Accept = "text/xml";    
        //HTTP method    
        Req.Method = "POST";    
        //return HttpWebRequest    
        return Req;    
    }    

حالا یک متد برای invoke کردن وب سرویس با استفاده از بدنه پاسخ SOAP ایجاد می کنیم.

public void InvokeService(int a, int b) {  
  //Calling CreateSOAPWebRequest method    
  HttpWebRequest request = CreateSOAPWebRequest();  
  
  XmlDocument SOAPReqBody = new XmlDocument();  
  //SOAP Body Request    
  SOAPReqBody.LoadXml(@ "<?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 >  
   < Addition xmlns = ""  
   http: //tempuri.org/"">    
   < a > " + a + @" < /a>   < b > " + b + @" < /b>   < /Addition>   < /soap:Body>   < /soap:Envelope>");    
  
  
   using(Stream stream = request.GetRequestStream()) {  
    SOAPReqBody.Save(stream);  
   }  
   //Geting response from request    
   using(WebResponse Serviceres = request.GetResponse()) {  
       using(StreamReader rd = new StreamReader(Serviceres.GetResponseStream())) {  
           //reading stream    
           var ServiceResult = rd.ReadToEnd();  
           //writting stream result on console    
           Console.WriteLine(ServiceResult);  
           Console.ReadLine();  
       }  
   }  
}
حالا متد بالا را از متد اصلی درون برنامه به روش زیر فراخوانی کنید. 
    static void Main(string[] args)    
    {    
        //creating object of program class to access methods    
        Program obj = new Program();    
        Console.WriteLine("Please Enter Input values..");    
        //Reading input values from console    
        int a = Convert.ToInt32(Console.ReadLine());    
        int b = Convert.ToInt32(Console.ReadLine());    
        //Calling InvokeService method    
        obj.InvokeService(a, b);    
    }    

حالا همه کدهایی که در داخل فایل Program.cs هستند مانند زیر خواهند بود:

using System;  
using System.IO;  
using System.Net;  
using System.Xml;  
  
namespace UsingSOAPRequest  
{  
    public class Program  
    {  
        static void Main(string[] args)  
        {  
            //creating object of program class to access methods  
            Program obj = new Program();  
            Console.WriteLine("Please Enter Input values..");  
            //Reading input values from console  
            int a = Convert.ToInt32(Console.ReadLine());  
            int b = Convert.ToInt32(Console.ReadLine());  
            //Calling InvokeService method  
            obj.InvokeService(a, b);  
        }  
        public void InvokeService(int a, int b)  
        {  
            //Calling CreateSOAPWebRequest method  
            HttpWebRequest request = CreateSOAPWebRequest();  
  
            XmlDocument SOAPReqBody = new XmlDocument();  
            //SOAP Body Request  
            SOAPReqBody.LoadXml(@"<?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>  
                <Addition xmlns=""http://tempuri.org/"">  
                  <a>" + a + @"</a>  
                  <b>" + b + @"</b>  
                </Addition>  
              </soap:Body>  
            </soap:Envelope>");  
  
  
            using (Stream stream = request.GetRequestStream())  
            {  
                SOAPReqBody.Save(stream);  
            }  
            //Geting response from request  
            using (WebResponse Serviceres = request.GetResponse())  
            {  
                using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream()))  
                {  
                    //reading stream  
                    var ServiceResult = rd.ReadToEnd();  
                    //writting stream result on console  
                    Console.WriteLine(ServiceResult);  
                    Console.ReadLine();  
                }  
            }  
        }  
  
        public HttpWebRequest CreateSOAPWebRequest()  
        {  
            //Making Web Request  
            HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(@"http://localhost/Employee.asmx");  
            //SOAPAction  
            Req.Headers.Add(@"SOAPAction:http://tempuri.org/Addition");  
            //Content_type  
            Req.ContentType = "text/xml;charset=\"utf-8\"";  
            Req.Accept = "text/xml";  
            //HTTP method  
            Req.Method = "POST";  
            //return HttpWebRequest  
            return Req;  
        }  
    }  
}  

خروجی نهایی به صورت زیر خواهد بود:

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 13k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید