# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > WCF , Web Services , .Net Remoting > آموزش: ارسال اطلاعات از طریق وب سرویس ها --- Send Data with Web Services

## alonemm

باسلام:

در مقاله آموزشی راه اندازی یک وب سرویس و استفاده از آن در برنامه های تحت وب و برنامه های تحت ویندوز  طریقه راه اندازی یک وب سرویس و بکارگیری اون در برنامه های کاربردی رو باهم دیدم.

در راستای سوالات انبوهی که پس از این مقاله از طرف کاربران در مورد چگونگی ارسال داده ها از وب سرویس مطرح شد تصمیم به ایجاد این تاپیک در همین خصوص کردم.

در این مقاله 2 روش برای ارسال داده ها توضیح داده میشود:
1- استفاده از اسناد استاندارد XML
2- استفاده از شی منبع داده Data Set





پ.و:
لطفا از پست های اضافه پرهیز کنید که تاپیک تمیز بمونه.
با تشکر.

----------


## alonemm

مرحله اول:

یک وب سرویس میسازیم که من در اینجا  MyWebService نام گزاریش کردم.
 ( در این مقاله توضیح داده شده ) 

خب حالا میریم سراغ تعریف یک متد برای ارسال داده توسط XML:



    [WebMethod]
    public XmlDocument ReturnXml()
    {
        XmlDocument dom = new XmlDocument();

        XmlElement people = dom.CreateElement("People");
        dom.AppendChild(people);

        XmlElement person = dom.CreateElement("Person");
        people.AppendChild(person);

        XmlElement firstName = dom.CreateElement("FirstName");
        person.AppendChild(firstName);

        XmlText text = dom.CreateTextNode("Majid");
        firstName.AppendChild(text);

        XmlElement LastName = dom.CreateElement("LastName");
        person.AppendChild(LastName);

        XmlText text2 = dom.CreateTextNode("Maghsoudipour");
        LastName.AppendChild(text2);

        // load some XML ...
        return dom;
    }



کمی درباره این متد توضیح میدم:
یک متد داریم ReturnXml که خروجیش یک XmlDocument میباشد.
در بدنه این متد ما ساختار یک فایل XML رو با خروجی زیر میسازیم:

  <Persons>
    <Name>Majid</Name>
    <Family>Maghsoudipour</Family>
    <id>1</id>
  </Persons>
  <Persons>
    <Name>Arman</Name>
    <Family>Maghsoudipour</Family>
    <id>2</id>
  </Persons>

و جواب رو در قالب یک سند XML ارسال میکند.

----------


## alonemm

خب تا اینجا متد مورد نظر برای ارسال داده ها در قالب XML رو ساختیم.

دقت کنید که من برای ساخت سند XML از کلاس ها و متدهای خود دات نت که در فضای نام System.Xml وجود دارد استفاده کردم و شما میتونید از روشهای دیگر برای ساخت سند XML اقدام کنید.

خب پس از پابلیش کردن وب سرویس و ارسال اون روی هاست مورد نظر اقدام به ایجاد یک پروژه وب سایت کنید و در اون به وب سرویس مورد نظر ارتباط پیدا کنید.
(تمامی آموزش های این مراحل در تاپیک قبلی با نام *راه اندازی یک وب سرویس و استفاده از آن در برنامه های تحت وب و برنامه های تحت ویندوز*
همراه با تصویر وجود دارد.)

----------


## alonemm

حالا در رویداد مورد نظر در سایت داده های مورد نظر رو از متد ReturnXml از وب سرویس دریافت میکنیم:


        com.somee.alonemm.MyWebService MWS = new com.somee.alonemm.MyWebService();
            
        XmlDocument myServiceDoc = new XmlDocument();
        System.Xml.XmlNode neNode;
        //Adding the resulting XML from WebMethod to a user created XmlNode
        neNode = MWS.ReturnXml();
        //Creating a Dataset
        DataSet myDataSet = new DataSet();
        //The XmlNode is added to a byte[]
        byte[] buf = System.Text.UTF8Encoding.ASCII.GetBytes(neNode.Out  erXml);
        System.IO.MemoryStream ms = new System.IO.MemoryStream(buf);
        //The XML is readed from the MemoryStream
        myDataSet.ReadXml(ms);

        GridView1.DataSource = myDataSet.Tables[0];
        GridView1.DataBind();


توضیحات کد:

در ابتدا یک شی از جنس وب سرویس مورد نظر میسازیم.
سپس یک شی از جنس اسناد XML میسازیم.
یک XmlNode با نام neNode میسازیم برای گرفتن XML به دست آمده از وب سرویس و با متد MWS.ReturnXml این شی رو مقدار دهی میکنیم.
خط بعد یک شی Data Set  میسازیم.
در خط بعد یک متغییر از نوع بایت میسازیم و سعی به گرفتن اطلاعات سند XML از وب سرویس به صورت بایت میکنیم.
(دقت کنید که برای نمایش درست کارکترهای فارسی حتما از کلاس UTF8Encoding از فضای نام System.Text استفاده کنید.)
در خط بعد XML رو در یک متغیر حافظه لود میکنیم.
و توسط متد ReadXml از شی DataSet منبع داده رو شکل میدیم.

در آخر این منبع داده رو به شی GridView مشخص و  اتصال میدیم.


حالا برنامه خودتون رو اجرا کنید و از خروجی اون لذت ببرید...!
همونطور که در تصویر زیر هم میبینید شما موفق شدید داده ها رو در قالب اسناد استاندارد XML از وب سرویس مورد نظر دریافت کنید و در سایت خودتون نمایش بدید.

----------


## alonemm

خب حالا به مرحله دوم ارسال داده با شی DataSet میریم:

وقتی یک نگاه به کلاس DataSet  میکنیم:


[SerializableAttribute]
public class DataSet : MarshalByValueComponent, IListSource, 
	IXmlSerializable, ISupportInitializeNotification, ISupportInitialize, ISerializable


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

پس در وب سرویس قبلی یک متد جدید اضافه میکنیم:


    [WebMethod]
    public DataSet GetData()
    {
        // First Create a New Connection
        using (SqlConnection connection = new SqlConnection())
        {
            // Now Pass a Connection String To the Connection
            connection.ConnectionString = "Connection String....";
            // Now the Select statement you want to run
            string select = "select * from Persons ";
            // Create an Adapter
            SqlDataAdapter da = new SqlDataAdapter(select, connection);
            // Create a New DataSet
            DataSet ds = new DataSet();
            // Fill The DataSet With the Contents of the Stock Table
            da.Fill(ds, "Persons");
            // Now Return ds which is a DataSet
            return (ds);
        }
    }


توضیحات متد:
کار این متد کاملا مشخص هست که به پایگاه داده متصل میشه و پس از اجرای یک کوئری و پر کردن شی DataSet اقدام به فرستادن این شی میکند.

برای دریافت در برنامه هم همانند زیر عمل کنید:


GridView2.DataSource = MWS.GetData();
GridView2.DataBind();


حالا پروژه رو ران کنید و لذت ببرید....!

----------


## alonemm

خب به پایان این آموزش رسیدیم امیدوارم دوستان بهره کافی از این مقاله رو برده باشن.

در کلام آخر باید بگم که این سرویس رو من روی هاستم با آدرس : http://alonemm.somee.com/MyWebService.asmx آپلود کردم و شما برای تست میتونید ازش استفاده کنید.

شما هم میتونید از این روش برای ساخت وب سرویس هایی که برای مثال خدماتی همانند جدول بازیهای مسابقات جام ملت ها - قیمت دلار و سکه و .... رو ارائه میدن استفاده کنید.




با احترام مجید مقصودی پور.

----------


## parhamt

سلام مجيد جان
خسته نباشي و سپاسگزار از زحماتي كه ميكشي .
فرض كنيد برنامه اي بر سروري داريم كه به بانكي وصل است و كار ويژه خودش را انجام ميدهد ودر عين حال كلاينت هايي داريد كه براي خودشان برنامه هايي در همان ضمينه برنامه سرور ولي محدودتر و بانك اطلاعاتي مخصوص خودشان را داريم كه با سرور در replication دو طرفه اطلاعات هستند و در اين ميان اين اعمال از طريق توابع بانك اطلاعاتي صورت ميگيرد ايا اين حالت را بر حسب اينكه سرور روي وب باشد يا غير وبي وقابل اتصال با ip باشد را ميتوان نوعي سرويس در نظر گرفت؟ 
حال اگر تحت وب يك برنامه حسابداري را با تخصيص فضاي مورد تقاضا در اختيار چندين مشتري بگذاريد ايا مصداقي از يك سرويس است ؟

----------


## alonemm

> سلام مجيد جان
> خسته نباشي و سپاسگزار از زحماتي كه ميكشي .
> فرض كنيد برنامه اي بر سروري داريم كه به بانكي وصل است و كار ويژه خودش را انجام ميدهد ودر عين حال كلاينت هايي داريد كه براي خودشان برنامه هايي در همان ضمينه برنامه سرور ولي محدودتر و بانك اطلاعاتي مخصوص خودشان را داريم كه با سرور در replication دو طرفه اطلاعات هستند و در اين ميان اين اعمال از طريق توابع بانك اطلاعاتي صورت ميگيرد ايا اين حالت را بر حسب اينكه سرور روي وب باشد يا غير وبي وقابل اتصال با ip باشد را ميتوان نوعي سرويس در نظر گرفت؟ 
> حال اگر تحت وب يك برنامه حسابداري را با تخصيص فضاي مورد تقاضا در اختيار چندين مشتري بگذاريد ايا مصداقي از يك سرويس است ؟


باسلام:

دوست عزیز ببنید مفهوم وب سرویس به این هست که شما به یک متد از یک کلاس متصل بشید و بدون اینکه بدونین سمت سرویس چه عملیاتی انجام میشه و جواب رو دریافت کنید که میتونه نوع های مختلفی داشته باشه.

یک برنامه کاربردی به این شکل رو که گفتید برنامه تحت شبکه نامگزاری میکنند نه وب سرویس.

موفق باشید.

----------


## niloofarabi

سلام اقای مقصودی 
ممنون از آموزش مفیدتون
یه سوالی برام پیش اومده .استفاده از کدوم یکی از این روش ها بهتره .یعنی سرعتش بیشتره ؟ 
و این که آیا برای حجم بالای داده ها هم (مثلا صد هزار رکورد ) این روش جوابگو هست ؟

----------


## alonemm

> سلام اقای مقصودی 
> ممنون از آموزش مفیدتون
> یه سوالی برام پیش اومده .استفاده از کدوم یکی از این روش ها بهتره .یعنی سرعتش بیشتره ؟ 
> و این که آیا برای حجم بالای داده ها هم (مثلا صد هزار رکورد ) این روش جوابگو هست ؟



باسلام:

برای گرفتن تعداد رکورد بالا میتونید از روش ارسال به صورت صفحه بندی دستی استفاده کنید.

که در تاپیک زیر آموزش داده شده:

 آموزش پیاده سازی Custom Paging در GridView با تکنولوژی Ajax


موفق باشید.

----------


## niloofarabi

> باسلام:
> 
> برای گرفتن تعداد رکورد بالا میتونید از روش ارسال به صورت صفحه بندی دستی استفاده کنید.
> 
> که در تاپیک زیر آموزش داده شده:
> 
>  آموزش پیاده سازی Custom Paging در GridView با تکنولوژی Ajax
> 
> 
> موفق باشید.


ممنون
من آموزش paging رو مطالعه کردم و خیلی عالی بود .ولی من منظورم با استفاده از سرویس بود .یعنی این که من میخوام یه تعداد رکورد رو در حجم بالا از یه دیتابیس بخونم و به یه دیتا بیس که روی یه سرور دیگه در یک شهر دیگه قرار داده منتقل کنم .با توجه به این که سرورهای من Valid IP ندارن نمیتونم از SQL Replication استفاده کنم و حدس زدم با استفاده از سرویس بتونم این کارو انجام بدم .من با آموزش هایی که شما در مورد انتقال دیتا با استفاده از سرویس توی همین سایت گذاشته بودید  ، تونستم این کار رو انجام بدم .البته با تعداد رکورد پایین .ولی برای حجم بالا مثلا 100 هزار رکورد  به مشکل خوردم.
 لطفا راهنماییم کنید

----------


## alonemm

> ممنون
> من آموزش paging رو مطالعه کردم و خیلی عالی بود .ولی من منظورم با استفاده از سرویس بود .یعنی این که من میخوام یه تعداد رکورد رو در حجم بالا از یه دیتابیس بخونم و به یه دیتا بیس که روی یه سرور دیگه در یک شهر دیگه قرار داده منتقل کنم .با توجه به این که سرورهای من Valid IP ندارن نمیتونم از SQL Replication استفاده کنم و حدس زدم با استفاده از سرویس بتونم این کارو انجام بدم .من با آموزش هایی که شما در مورد انتقال دیتا با استفاده از سرویس توی همین سایت گذاشته بودید  ، تونستم این کار رو انجام بدم .البته با تعداد رکورد پایین .ولی برای حجم بالا مثلا 100 هزار رکورد  به مشکل خوردم.
>  لطفا راهنماییم کنید


باسلام:

شما میتونید اطلاعات رو به صورت صفحه بندی از پایگاه داده مورد نظرتون واکشی کنید و به وب سرور مورد نظرتون ارسال کنید.

----------


## zdavood

سلام عرض ادب خدمت همه ی دوستان و اساتید
ارسال اطلاعات به یک وب سرویس در سی شارپ و گرفتن اطلاعات از اون وب سرویس (آخرین اخبار ولیست دانلود ها و اعضا و...) رو از طریق فایل جیسون هم میشه انجام داد ؟؟
* فایل جیسونی که خرجی همون وب سرویس است *
ممنون میشم راهنماییم کنید ..

----------


## runsysco

سلام استاد . یک سوال داشتم خدمتتون 
من یک سرویس دارم که یک کلاس به نام person ( که خودش دو فیلد id , name nhvi ) v, به صورت استرینگ بر میگردونه . مشکل من اینجاست که با وجود اینکه اونو سریال میکنم و در اون سمت هم deserial مثکنم متاسفانه نمیتوم به مقادیر فیلدم دسترسی داشته باشم


  [WebMethod]
       ( public string getinfobync(string s 


}
  Person  p = Person.getbynationalcode(s);
            XmlSerializer XSerializer = new XmlSerializer(p.GetType());
 StringWriter textWriter = new StringWriter();
            XSerializer.Serialize(textWriter, p);
  textWriter.Close();
  return textWriter.ToString();

{

person نامه کلاسه منه که با تابع getbynationalcode و گرفتن پارامتر ورودی یک نتیجه ای رو که درش 2 فیل id , name هستند رو برمیگردونه
مشکل من سمت اینجاست که نمیتونم اون سمت داده های استرینگ شامله جواب تابع خودمو تفکیک شده دریافت کنم

سمت کلاینت



            string xmlstring = SC.getinfobync(textBox2.Text);
            StringReader StReader = new StringReader(xmlstring);
            XmlSerializer XSerializer = new XmlSerializer(StReader.GetType());


                   Person p = new Person();


            p = (Person)XSerializer.Deserialize(StReader);


                textBox1.Text = p.id.ToString() + p.name;

----------

