PDA

View Full Version : آموزش: ارسال اطلاعات از طریق وب سرویس ها --- Send Data with Web Services



alonemm
شنبه 03 تیر 1391, 14:19 عصر
باسلام:

در مقاله آموزشی راه اندازی یک وب سرویس و استفاده از آن در برنامه های تحت وب و برنامه های تحت ویندوز (http://barnamenevis.org/showthread.php?274518-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%DB%8C%DA%A9-%D9%88%D8%A8-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%AD%D8%AA-%D9%88%D8%A8-%D9%88-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%AD%D8%AA-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2) طریقه راه اندازی یک وب سرویس و بکارگیری اون در برنامه های کاربردی رو باهم دیدم.

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

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





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

alonemm
شنبه 03 تیر 1391, 14:24 عصر
مرحله اول:

یک وب سرویس میسازیم که من در اینجا MyWebService نام گزاریش کردم.
( در این مقاله توضیح داده شده (http://barnamenevis.org/showthread.php?274518-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%DB%8C%DA%A9-%D9%88%D8%A8-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%AD%D8%AA-%D9%88%D8%A8-%D9%88-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%AD%D8%AA-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2) )

خب حالا میریم سراغ تعریف یک متد برای ارسال داده توسط 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
شنبه 03 تیر 1391, 14:53 عصر
خب تا اینجا متد مورد نظر برای ارسال داده ها در قالب XML رو ساختیم.

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

خب پس از پابلیش کردن وب سرویس و ارسال اون روی هاست مورد نظر اقدام به ایجاد یک پروژه وب سایت کنید و در اون به وب سرویس مورد نظر ارتباط پیدا کنید.
(تمامی آموزش های این مراحل در تاپیک قبلی با نام راه اندازی یک وب سرویس و استفاده از آن در برنامه های تحت وب و برنامه های تحت ویندوز (http://barnamenevis.org/showthread.php?274518-%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%DB%8C%DA%A9-%D9%88%D8%A8-%D8%B3%D8%B1%D9%88%DB%8C%D8%B3-%D9%88-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-%D8%A2%D9%86-%D8%AF%D8%B1-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%AD%D8%AA-%D9%88%D8%A8-%D9%88-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%D8%AD%D8%AA-%D9%88%DB%8C%D9%86%D8%AF%D9%88%D8%B2)
همراه با تصویر وجود دارد.)

alonemm
شنبه 03 تیر 1391, 15:04 عصر
حالا در رویداد مورد نظر در سایت داده های مورد نظر رو از متد 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
شنبه 03 تیر 1391, 15:54 عصر
خب حالا به مرحله دوم ارسال داده با شی 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
شنبه 03 تیر 1391, 16:03 عصر
خب به پایان این آموزش رسیدیم امیدوارم دوستان بهره کافی از این مقاله رو برده باشن.

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

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




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

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

alonemm
یک شنبه 05 شهریور 1391, 15:28 عصر
سلام مجيد جان
خسته نباشي و سپاسگزار از زحماتي كه ميكشي .
فرض كنيد برنامه اي بر سروري داريم كه به بانكي وصل است و كار ويژه خودش را انجام ميدهد ودر عين حال كلاينت هايي داريد كه براي خودشان برنامه هايي در همان ضمينه برنامه سرور ولي محدودتر و بانك اطلاعاتي مخصوص خودشان را داريم كه با سرور در replication دو طرفه اطلاعات هستند و در اين ميان اين اعمال از طريق توابع بانك اطلاعاتي صورت ميگيرد ايا اين حالت را بر حسب اينكه سرور روي وب باشد يا غير وبي وقابل اتصال با ip باشد را ميتوان نوعي سرويس در نظر گرفت؟
حال اگر تحت وب يك برنامه حسابداري را با تخصيص فضاي مورد تقاضا در اختيار چندين مشتري بگذاريد ايا مصداقي از يك سرويس است ؟

باسلام:

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

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

موفق باشید.

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

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


باسلام:

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

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

آموزش پیاده سازی Custom Paging در GridView با تکنولوژی Ajax (http://barnamenevis.org/showthread.php?322558-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-Custom-Paging-%D8%AF%D8%B1-GridView-%D8%A8%D8%A7-%D8%AA%DA%A9%D9%86%D9%88%D9%84%D9%88%DA%98%DB%8C-Ajax)


موفق باشید.

niloofarabi
دوشنبه 30 بهمن 1391, 10:33 صبح
باسلام:

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

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

آموزش پیاده سازی Custom Paging در GridView با تکنولوژی Ajax (http://barnamenevis.org/showthread.php?322558-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D9%BE%DB%8C%D8%A7%D8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C-Custom-Paging-%D8%AF%D8%B1-GridView-%D8%A8%D8%A7-%D8%AA%DA%A9%D9%86%D9%88%D9%84%D9%88%DA%98%DB%8C-Ajax)


موفق باشید.

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

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

باسلام:

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

zdavood
شنبه 11 دی 1395, 10:39 صبح
سلام عرض ادب خدمت همه ی دوستان و اساتید
ارسال اطلاعات به یک وب سرویس در سی شارپ و گرفتن اطلاعات از اون وب سرویس (آخرین اخبار ولیست دانلود ها و اعضا و...) رو از طریق فایل جیسون هم میشه انجام داد ؟؟
* فایل جیسونی که خرجی همون وب سرویس است *
ممنون میشم راهنماییم کنید ..

runsysco
دوشنبه 02 اسفند 1395, 22:10 عصر
سلام استاد . یک سوال داشتم خدمتتون
من یک سرویس دارم که یک کلاس به نام 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;