ورود

View Full Version : آموزش: کار با وب سرویس ها،به وسیله جاوااسکریپت و ثبت اطلاعات در بانک و خواندن آنها+ معماری جند لایه



majnun
یک شنبه 02 آبان 1389, 19:23 عصر
سلام خدمت دوستان محترم
یه برنامه خیلی ساده برای ثبت اطلاعات در بانک و خوندن اون بوسیله جاوا اسکریپت و وب سرویس ها نوشتم برای نمونه و یادگیری امیدوارم بدردتون بخوره
این فیلدهای بانک اطلاعاتی هستش
id
name
lname
mobile
بعد اومدم یه کلاس ساختم به این صورت با این فیلدها و پروپرتی ها :


using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.Web.Services;
using System.Web.Services.Protocols;
/// <summary>
/// Summary description for student
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class booknumber
{
private int id;

public int Id
{
get { return id; }
set { id = value; }
}
private string name;

public string Name
{
get { return name; }
set { name = value; }
}
private string lname;

public string Lname
{
get { return lname; }
set { lname = value; }
}
private string moile;

public string Moile
{
get { return moile; }
set { moile = value; }
}

public booknumber()
{
//
// TODO: Add constructor logic here
//
}


}





بعدش باید یک وب سرویس به پروژه اضافه کنیم
هنگام اضافه شدن وب سرویس درون پروژه یک کلاس به نام اون وب سرویس درون پروژه قرار میگیره

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

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


// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]


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

کد درون کلاس وب سرویس :



using System;
using System.Collections;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;
using System.Data.SqlClient;
using System.Configuration;
using System.Data;
using System.Collections.Generic;

/// <summary>
/// Summary description for booknumberservic
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class booknumberservic : System.Web.Services.WebService {

public booknumberservic () {

//Uncomment the following line if using designed components
//InitializeComponent();
}

[WebMethod]
public string HelloWorld() {
return "Hello World";
}

[WebMethod()]
public int insert_booknumber(string aname, string alname, string amobile)
{

SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings.Get ("con_str"));
SqlCommand cmd = new SqlCommand("insert_booknumber", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@name", aname);
cmd.Parameters.AddWithValue("@lname", alname);
cmd.Parameters.AddWithValue("@mobile", amobile);
cmd.Connection = con;

con.Open();
int res = 0;
try
{
res = cmd.ExecuteNonQuery();
con.Close();
return res;
}
catch
{
con.Close();
return res;
}
}

[WebMethod()]
public List<booknumber> select_booknumber()
{
SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings.Get ("con_str"));
SqlCommand Cmd = new SqlCommand("Select_booknumber", con);
Cmd.Connection = con;
Cmd.CommandType = CommandType.StoredProcedure;
// Cmd.Parameters.AddWithValue("@id", int.Parse(id));
con.Open();
SqlDataReader dr = Cmd.ExecuteReader();
if (!dr.HasRows)
{
dr.Close();
return null;
}
else
{
List<booknumber> List = new List<booknumber>();

while (dr.Read())
{
booknumber temp= new booknumber();
temp.Name = dr.GetString(0);
temp.Lname = dr.GetString(1);
temp.Moile = dr.GetString(2);
List.Add(temp);
}
return List;
dr.Close();
}
}
}






خب حالا باید درون صفحه یک اسکریپت منیحر قرار دهیم و وب سرویس خودمان را به آن معرفی کنیم




<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
<Services>
<asp:ServiceReference Path="wbeservices/booknumberservic.asmx" />
</Services>
</asp:ScriptManager>




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

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




function pageLoad()
{
booknumberservic.select_booknumber(suc1);
}

function Button1_onclick()
{
name=document.getElementById("TextBox1").value;
lname=document.getElementById("TextBox2").value;
mobile=document.getElementById("TextBox3").value;
if (name!="",lname!="",mobile!="")
{
booknumberservic.insert_booknumber(name,lname,mobi le,suc);
}
else
{
alert('اطلاعات را به صورت کامل وارد کنید. فیلدی نباید خالی باشد');
}

}




توجه کنید در کد زیر




booknumberservic.insert_booknumber(name,lname,mobi le,suc);




ما 4 پارامتر درون پرانتز نوشته ایم در صورتی که تابع وب متد ما درون کلاس وب سرویس 3 پارامتر میخواهد

در حقیقت این پارامتر آخر معرفی تابعی میباشد که قرار است خروجی ای که کلاس وب سرویس به ما میدهد را در آن نمایش دهیم
این کلاس به این صورت تعریف شده است




function suc(res)
{
if (res==1)
{
alert("ثبت اطلاعات با موفیت صورت گرفت");
booknumberservic.select_booknumber(suc1);
document.getElementById("TextBox1").value="";
document.getElementById("TextBox2").value="";
document.getElementById("TextBox3").value="";
}
else
{
alert("ثبت اطلاعات با خطا مواجه گردید");
}
}





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

برای این منظور ما در فرم لود صفحه (سمت کلاینت ) تابعی از وب سرویس را فراخوانی کرده و لیستی از اطلاعات را از آن دریافت میکنیم

کد فرم لود :



function pageLoad()
{
booknumberservic.select_booknumber(suc1);
}




کد تابع برای گرفتن اطلاعات ارسالی توسط وب سرویس:




function suc1(res)
{
array=res;
try
{
if (array[count].Name==null )
{
//
}
}
catch(e)
{
alert('به انتهای رکورد ها رسیده اید');
count-=1;
}
TD_name.innerHTML="نام = "+array[count].Name;
TD_Lname.innerHTML="نام خانوادگی = "+array[count].Lname;
TD_mobile.innerHTML="شماره موبایل = "+array[count].Moile;

}


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



var count=0;
function Button3_onclick() {
count=count+1;
suc1(array);
}

function Button2_onclick() {
if (count==0)
{
alert('به ابتدای رکورد ها رسیده اید');
}
else
{
count-=1;
suc1(array);
}
}





و در اخر کدهای تگ اسکریپت را به طور کامل میزارم که کاملا متوجه بشد:




<script language="javascript" type="text/javascript">
// <!CDATA[
var name="";
var lname="";
var mobile="";
var array;
function pageLoad()
{
booknumberservic.select_booknumber(suc1);
}

function Button1_onclick()
{
name=document.getElementById("TextBox1").value;
lname=document.getElementById("TextBox2").value;
mobile=document.getElementById("TextBox3").value;
if (name!="",lname!="",mobile!="")
{
booknumberservic.insert_booknumber(name,lname,mobi le,suc);
}
else
{
alert('اطلاعات را به صورت کامل وارد کنید. فیلدی نباید خالی باشد');
}

}

function suc(res)
{
if (res==1)
{
alert("ثبت اطلاعات با موفیت صورت گرفت");
booknumberservic.select_booknumber(suc1);
document.getElementById("TextBox1").value="";
document.getElementById("TextBox2").value="";
document.getElementById("TextBox3").value="";
}
else
{
alert("ثبت اطلاعات با خطا مواجه گردید");
}
}
var count=0;
function Button3_onclick()
{
count=count+1;
suc1(array);
}

function Button2_onclick()
{
if (count==0)
{
alert('به ابتدای رکورد ها رسیده اید');
}
else
{
count-=1;
suc1(array);
}
}

function suc1(res)
{
array=res;
try
{
if (array[count].Name==null )
{
//
}
}
catch(e)
{
alert('به انتهای رکورد ها رسیده اید');
count-=1;
}
TD_name.innerHTML="نام = "+array[count].Name;
TD_Lname.innerHTML="نام خانوادگی = "+array[count].Lname;
TD_mobile.innerHTML="شماره موبایل = "+array[count].Moile;
}

// ]]>
</script>




فایل برنامه رو ضمیمه میکنم میتونید دریافت کنید
اگه سوالی یا مشکلی بود من در خدمتم

التماس دعا

Mohandes2009
دوشنبه 10 آبان 1389, 19:51 عصر
خواهشا در مورد کد ها بیشتر توضیح بده کد های جاوا اسکریپت و کد هایی که داخل وب سرویس هست:ناراحت:

majnun
دوشنبه 10 آبان 1389, 20:35 عصر
عزیز من من کدهای جاوا اسکریپت را توضیح میدم اگه مشکلی بود در مورد کدهای دیگر بیان کنید در خدمتم :

در جاوا اسگریپت برای تغریف متغیر باید به اینگونه عمل کرد :



var name="";
var lname="";
var mobile="";



در جاوااسکریپت شما برای متغیر نوع تعریف نمیکنید ....

با کد زیر میتوان مقدار یک کنترل را که id آن را میدهیم بگیریم که البته این مقدار برای تکست باکس value میباشد و برای کنترل های دیگر شاید فرق کند :



name=document.getElementById("TextBox1").value;



خط زیر را مشاهده کنید :



booknumberservic.insert_booknumber(name,lname,mobi le,suc);



این خط میاد از وب سرویس booknumberservic که در اسکریپت منیجر به صفحه معرفی کردیم تابع insert_booknumber را با پارامتر های ورودی آن تابع فراخوانی میکند با این تفاوت که اگر به تابع دورن کبلس وب سرویس دقت کنید داراس 3 پارامتر میباشد ولی ما اینجا 4 پارامتر قرار دادیم
در حقیقت این پارامتر چهارم اسم تابعی هست که خروجی وب سرویس درون آن قرار میکیرد
برای همین ما تابع Suc را تغریف کردیم که دارای ورودی res میباشد که در حقیقت Res همان خروجی وب سرویس است که ورودی این تابع میشود



function suc(res)
{
if (res==1)
{
alert("ثبت اطلاعات با موفیت صورت گرفت");
booknumberservic.select_booknumber(suc1);
document.getElementById("TextBox1").value="";
document.getElementById("TextBox2").value="";
document.getElementById("TextBox3").value="";
}
else
{
alert("ثبت اطلاعات با خطا مواجه گردید");
}
}



در کد بالا ما مقدار خروجی تابع را میگیریم اگر وب سرویس ما درست کارش را انجام دهد خروجی اش 1 میباشد و ما اینجا با پیغامی تایید ثیت اطلاعات را میدهیم و متن درون تکست باکس هارا پاک میکنیم و اگر مقداری غیر از این داد پیغام خطا میدهد

این کد را مشاهده کنید :




function pageLoad()
{
booknumberservic.select_booknumber(suc1);
}



این کد کار پیج لود را میکند و اینبار در سمت کلاینت .( توجه کنید که این تابع بعد از پیج لود سمت سرور رخ میدهد)

در تابع پیج لود ما از وب سرویس booknumberservic تابع select_booknumber را فراخوانی میکنیم ، توجه کنید که در اینجا ما یک ورودی درون تابع نوشتم که در حقیقت این خروجی تابع میباشد نه ورودی :لبخند:

خروجی این وب سرویس درون تابع suc1 ریخته میشود : از آنجا که خروجی این وب سرویس لیستی از داده میباشد ورودی این تابع نیز لیستی از داده ها میباشد .



function suc1(res)
{
array=res;
try
{
if (array[count].Name==null )
{
//
}
}
catch(e)
{
alert('به انتهای رکورد ها رسیده اید');
count-=1;
}
TD_name.innerHTML="نام = "+array[count].Name;
TD_Lname.innerHTML="نام خانوادگی = "+array[count].Lname;
TD_mobile.innerHTML="شماره موبایل = "+array[count].Moile;
}



خب حالا تک تک خطوط کد بالا را توضیح میدم

خط زیر ورودی تابع را درون متغیر array میریزد



array=res;



این سه خط مقدار آرایه را درون تکست باکس میریزد (البته ایندکس متغیر count میباشد )



TD_name.innerHTML="نام = "+array[count].Name;
TD_Lname.innerHTML="نام خانوادگی = "+array[count].Lname;
TD_mobile.innerHTML="شماره موبایل = "+array[count].Moile;




درون فرم 2 دکمه موجود هست که یکی برای دیدن رکورد بعدی و یکی برای دیدن رکورد قبلی می باشد

این کد برای دیدن رکورد بعدی :




function Button3_onclick()
{
count=count+1;
suc1(array);
}



این کد یکی به مقدار Sount اضافه میکنه و تابع Suc1 را با ورودی array فراخوانی میکند

و تابع زیر نیز :




function Button2_onclick()
{
if (count==0)
{
alert('به ابتدای رکورد ها رسیده اید');
}
else
{
count-=1;
suc1(array);
}
}



یکی از Count کم میکند و تابع suc1 را فراخوانی میکند .


اگه سوالی دیگه دارید من در خدمتم

mmnoody2006
دوشنبه 10 آبان 1389, 21:55 عصر
علی رضا جان لطفا این همه کد ها رو توی تاپیک نذار خود برنامه گویای همه چیزه
با تشکر

mohsen-sh
پنج شنبه 23 دی 1389, 15:23 عصر
اقا خیلی خوبه
فقط چرا وقتی من برنامه مشابه رو توی web app ایجاد میکنم عمل نمیکنه
لطفا پاسخ بدین

majnun
پنج شنبه 23 دی 1389, 17:09 عصر
برای من که عمل میکنه برای دیگران هم کرد تا جایی که میدونم

یه مشکلی در کدت هست ، بزار ببینم چیه مشکلش

omidghadiri
پنج شنبه 23 دی 1389, 21:22 عصر
با عرض سلام و خسته نباشید.


سئوال بنده اینجاست که آیا میشه توسط جاوا اسکریپت اطلاعات رو هش کرد. جوری که نشه به حالت اولیه درآورد به عنوام مثال ما یه متغیری در صفحه درست میکنیم و از طریق Code Behind بهش اطلاعات رو پاس میکنیم مثلا متغیر نام یه اسم میگیره Ali ، حالا میخواهیم همین علی رو به 21kjhfslkhjjgjlfjs2336 در بیاریم .

آیا همچین چیزی عملی هست یا نه؟(آیا الگوریتمی وجود داره که نشه هکش کرد؟)

mohsen-sh
پنج شنبه 23 دی 1389, 23:19 عصر
این یه نمونه که من در وب اپلیکیشن ایجاد کردم و جواب نگرفتم در ضمیمه
ممنون

mehrdad201
جمعه 24 دی 1389, 22:02 عصر
با عرض سلام و خسته نباشید.


سئوال بنده اینجاست که آیا میشه توسط جاوا اسکریپت اطلاعات رو هش کرد. جوری که نشه به حالت اولیه درآورد به عنوام مثال ما یه متغیری در صفحه درست میکنیم و از طریق Code Behind بهش اطلاعات رو پاس میکنیم مثلا متغیر نام یه اسم میگیره Ali ، حالا میخواهیم همین علی رو به 21kjhfslkhjjgjlfjs2336 در بیاریم .

آیا همچین چیزی عملی هست یا نه؟(آیا الگوریتمی وجود داره که نشه هکش کرد؟)

فکر کنم هش کردن در جاوااسکریپت امکان پذیره

این لینک (http://www.movable-type.co.uk/scripts/sha1.html)رو ببینید. و 100 البته این لینک (http://pajhome.org.uk/crypt/md5/)

majnun
یک شنبه 26 دی 1389, 06:41 صبح
ممنون میشم موضوع تاپیک را عوض نکنید ... تشکر

emad4000
یک شنبه 16 تیر 1392, 14:48 عصر
سلام
ضمن تشکر یک سوال داشتم
چه الزامی هست که توابع موردنظر ما، در Web Service پیاده بشن؟
آیا میشه این توابع رو در Code Behind همون صفحه اصلی نوشت و بعد با این روش بهش پاس کرد؟
آیا استفاده از Web Service تاثیری در افزایش کارایی داره یا اینکه هدف فقط اینه که بعداً این متدها رو از جاهای دیگه هم فراخوانی کرد؟

gilas1368
سه شنبه 02 اردیبهشت 1393, 16:32 عصر
ی سوال
شما گفتید کد زیر رو باید اضافه کنین

[System.Web.Script.Services.ScriptService]

اما من این کد رو ک اضافه میکنم ب Script خطا میگیره و نمشناستش
باید چیکا کنم؟

emad4000
سه شنبه 06 خرداد 1393, 08:53 صبح
ی سوال
شما گفتید کد زیر رو باید اضافه کنین

[System.Web.Script.Services.ScriptService]

اما من این کد رو ک اضافه میکنم ب Script خطا میگیره و نمشناستش
باید چیکا کنم؟

دوست عزیز، عبارت زیر

[System.Web.Script.Services.ScriptService]
باید عیناً و بدون اون کدهای HTML ای که شما در کدتون اشاره کردید نوشته بشه

ضمناً حتماً دقت دارید که این کد بالای متد درون Web Service که در Code Behind پروژه تون قرار داره نوشته میشه، نه در صفحه HTML ای که در UI پروژه هست.

emad4000
یک شنبه 22 تیر 1393, 12:00 عصر
سلام
ضمن تشکر یک سوال داشتم
چه الزامی هست که توابع موردنظر ما، در Web Service پیاده بشن؟
آیا میشه این توابع رو در Code Behind همون صفحه اصلی نوشت و بعد با این روش بهش پاس کرد؟
آیا استفاده از Web Service تاثیری در افزایش کارایی داره یا اینکه هدف فقط اینه که بعداً این متدها رو از جاهای دیگه هم فراخوانی کرد؟

سلام
كسي به اين سوال من جواب نداد. سوال من اينه كه اگر UI برنامه ما فقط روي يك Platform باشه (يعني روي وب باشه و ديگه روي موبايل يا غيره نباشه)، در اين صورت آيا الزامي به استفاده از لايه Webservice هست؟ به نظر خود من تحت اين شرايط اگر كدهاي مورداشاره رو توي Code-behind اون صفحه ASPX هم بنويسيم فرقي نمي كنه
شما با حرف من موافق هستيد؟؟؟؟؟