PDA

View Full Version : آموزش: ارسال اطلاعات از طریق روش Post



fakhravari
پنج شنبه 16 آذر 1391, 18:44 عصر
مقدمه:

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


QuryString: در این روش اطلاعات از طریق آدرس صفحه یا همان URL ارسال می شوند و مشکل خاصی در این زمینه وجود ندارد .
Post: در این روش اطلاعات داخل فیلد های مخفی (HiddenField) در صفحه قرار می گیرند. پس از اینکه فرم صفحه وب submit شد، اطلاعات به آدرسی که در ویژگی Action فرم قرار دارد Post می شوند و سپس در آدرس مقصد با استفاده از دستور Request.Form می توان به محتویات فلید های مخفی دسترسی پیدا نمود.

با توجه به اینکه ارسال اطلاعات از طریق Post امروزه رواج زیادی پیدا کرده است و بسیاری از بانک های ایرانی و خارجی هم اکنون از این روش برای دریافت اطلاعات استفاده می کنند، در این مقاله به بررسی این موضوع خواهیم پرداخت.
همانطور که مستحضر می باشید صفحات ASP.Net (بدیهی است که منظور ما WebForm ها می باشند و نه ASP.NET MVC) به طور پیش فرض اطلاعات یک صفحه را هنگام submit شدن فرم به خود آن صفحه Post می کنند که به این روش PostBack گفته می شود. بنابراین Post نمودن اطلاعات به یک وب سایت دیگر در حالت عادی امکان پذیر نمی باشد.
برای حل این مشکل از روش های مختلفی استفاده می شود. یک روش این است که با استفاده از زبان جاوا اسکریپت و HTML یک فرم را به صورت داینامیک ایجاد نموده و همراه با دستور submit در صفحه بنویسیم.
اما گاهی نیاز است که دستور Post شدن اطلاعات را از درون یک کلاس یا کتابخانه ای که حتی در یک لایه فیزیکی متفاوت (Tire) قرار دارد صادر کنیم.
هم اکنون کلاسی خواهیم نوشت که انجام عمل Post نمودن اطلاعات را به راحت ترین شکل ممکن امکان پذیر می نماید.

using System.Collections.Specialized;using System.Web;


namespace Fakhravary.Security
{
public class RemotePost
{
private NameValueCollection inputValues;


/// <summary>
/// Gets or sets a remote URL
/// </summary>
public string Url { get; set; }


/// <summary>
/// Gets or sets a method
/// </summary>
public string Method { get; set; }


/// <summary>
/// Gets or sets a form name
/// </summary>
public string FormName { get; set; }


private NameValueCollection Params
{
get
{
return inputValues;
}
}


/// <summary>
/// Constructor
/// </summary>
/// <param name="url">Remote page url</param>
public RemotePost(string url)
{
inputValues = new NameValueCollection();
Url = url;
Method = "post";
FormName = "formName";
}


/// <summary>
/// Adds the specified key and value to the dictionary (to be posted).
/// </summary>
/// <param name="name">The key of the element to add</param>
/// <param name="value">The value of the element to add.</param>
public void Add(string name, string value)
{
inputValues.Add(name, value);
}


/// <summary>
/// Post
/// </summary>
public void Post()
{
var context = HttpContext.Current;
context.Response.Clear();
context.Response.Write("<html><head>");
context.Response.Write(string.Format("</head><body onload=\"document.{0}.submit()\">", FormName));
context.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >", FormName, Method, Url));


for (int i = 0; i < Params.Count; i++)
context.Response.Write(string.Format("<input name=\"{0}\" type=\"hidden\" value=\"{1}\">",
HttpUtility.HtmlEncode(Params.Keys[i]), HttpUtility.HtmlEncode(Params[Params.Keys[i]])));


context.Response.Write("</form>");
context.Response.Write("</body></html>");
context.Response.End();
}


}
}




عملکرد کلاس فوق کاملا مشخص می باشد. با استفاده از خصوصیت Add نام و مقادیری که قرار است Post شود را دریافت مشخص می کنیم و سپس متد Post یک صفحه ی مناسب با نیاز ما را شبیه سازی نموده و اطلاعات را در Response خروجی صفحه می نویسد و در نتیجه اطلاعات Post می شوند.
فرض کنید قصد داریم اطلاعاتی را از قبیل شناسه فروشنده، مبلغ و نام وب سایت را به صفحه ای به آدرس http://www.Sample.com/RemotePage.aspx از طریق روش Post ارسال کنیم.

var remotePost = new RemotePost("WebForm3.aspx"); remotePost.Add("MerchantID", "123456789");
remotePost.Add("Price", "10000");
remotePost.Add("WebSite", "www.30sharp.com");
remotePost.Post();



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


string merchanId = Request.Form["MerchantID"]; string price = Request.Form["Price"];
string website = Request.Form["WebSite"];
منبع : http://30sharp.com

malloc
پنج شنبه 16 آذر 1391, 18:55 عصر
دوست عزیز من یه سایت معرفی شرکت دارم میسازم . یکی از امکاناتی که این سایت باید داشته باشه اینه که به اتوماسیون شرکت که دارای یک IP معتبر هست وصل بشه . حالا با دستور شما میتونم این اتصال بین سایت اینترنتی و سایت اتوماسیون(سرور شرکت) انجام بدم

fakhravari
پنج شنبه 16 آذر 1391, 19:06 عصر
دوست عزیز من یه سایت معرفی شرکت دارم میسازم . یکی از امکاناتی که این سایت باید داشته باشه اینه که به اتوماسیون شرکت که دارای یک IP معتبر هست وصل بشه . حالا با دستور شما میتونم این اتصال بین سایت اینترنتی و سایت اتوماسیون(سرور شرکت) انجام بدم

مزیت این روش نمایش ندادن کلمات query string است

malloc
دوشنبه 27 آذر 1391, 21:41 عصر
راستی یه سوال دیگه آقای فخراوری
برای استفاده از اون کلاس RemotePost که گفتید باید using خاصی رو به صفحه اضافه کنیم.

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

fakhravari
دوشنبه 27 آذر 1391, 22:59 عصر
به همین سادگی.
Rename کلاس یا namespace خاصی بزارید

malloc
دوشنبه 27 آذر 1391, 23:05 عصر
به همین سادگی.
Rename کلاس یا namespace خاصی بزارید
از حرفاتون متوجه شدم که کاره آسونیه .
اما بازم من همون خطا ها رو دارم . یعنی به مقدار زیر گیر میده:

NameValueCollection

fakhravari
دوشنبه 27 آذر 1391, 23:08 عصر
یه نمونه درست کن بزار

malloc
دوشنبه 27 آذر 1391, 23:12 عصر
96853
اینم یه نمونه شاید یکم کاری که کردم مبتدی باشه . اگه مبتدی بود ببخشید:خجالت:

fakhravari
سه شنبه 28 آذر 1391, 02:42 صبح
این
private NameValueCollection inputValues;
و
private NameValueCollection Params
{
get
{
return inputValues;
}
}
باید using کنید
using System.Collections.Specialized;

malloc
چهارشنبه 29 آذر 1391, 13:01 عصر
دادشی like داری استفاده کردم و کار کرد . دمت گرم خیلی تابع توپولی بود.

فقط یه نکته که شاید به این تاپیک مربوط نباشه اما میپرسم ایشالا که جوابمو بدید.

نکته اینه که من از سایتم لینک میدم (با استفاده از روش فوق) به یه سایت دیگه. اما میخوام سایته تو یه tap جدید باز بشه نه اینکه سایت مقصد رو سایت خودم باز بشه


اگه متوجه نشدید بگید بیشتر توضیح بدم

fakhravari
چهارشنبه 29 آذر 1391, 18:27 عصر
دقیقا نمیدونم چی میخواهی اگر مقداری از سرور دیگری میخونی میتونی از وب سرویس استفاده کنی.
اگر باید حتما به سایت دیگری مراجعه کنید میتونید در یک ifram اون سایت فراخونی کنید.

malloc
پنج شنبه 30 آذر 1391, 10:22 صبح
خوب پس یکم بیشتر توضیح میدم.

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

حالا من میخوام وقتی رو لینک رفتن به اتوماسیون شرکت کلیک کرد اتوماسیون شرکت رو داخل یک تب (یا یک صفحه) جدید باز کنه

یعنی یجورایی شبیه دو تا عکس زیر

96959

96958

fakhravari
پنج شنبه 30 آذر 1391, 12:03 عصر
از توی کد ارسال ایمیل target=blank تنظیم کن روی لینک.

malloc
پنج شنبه 30 آذر 1391, 12:20 عصر
فخرآوری جان شرمنده میدونم سولام همش مبتدی و .... اما بازم یه نکته وجود داره که نتونستم ازش استفاده کنم.
اونم اینه که من یه LinkButton دارم که دیزاینش مثل کد زیره :


<asp:LinkButton ID="LnkOfficeAutomation" runat="server" Text="<%$ Resources:Resource, LnkOfficeAutomation %>"
PostBackUrl="#" target="_blank" onclick="LnkOfficeAutomation_Click"></asp:LinkButton>و داخل رویداد کلیکش اینو نوشتم :


var remotePost = new RemotePost("http://www.footbali.somee.com/Pages/About.aspx");
remotePost.Add("ID", "1");
remotePost.Post();

اما نکته اینجاست که وقتی خاصیت زیر رو ست(set) میکنم عملا کاری نمیکنه (یعنی رویداد کلیک لینک باتون اجرا نمیشه)

target="_blank"

fakhravari
پنج شنبه 30 آذر 1391, 13:18 عصر
نه عزیزم .
شما مگه اون لینک که به ایمیل اومده نمیخواستی؟
اون رشته را باید این خاصیت بدی.

malloc
پنج شنبه 30 آذر 1391, 13:26 عصر
نه بابا اون 2تا عکس ایمیل و .... فقط به عنوان نمونه بود.

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

malloc
شنبه 02 دی 1391, 11:58 صبح
خوب فخرآوری جان یه سوال جدید.
مشکل قبلیم حل شد.
الان میخوام یه سوال کنم ببینم این روشی که شما گفتی عملا میتونه جایگزین querystring باشه یا نه ؟؟؟(یعنی اگه بجای کووری استرینگ ازش استفاده کنیم منطقی و اصولیه؟)

z_software
شنبه 02 دی 1391, 12:09 عصر
سلام، ببخشید یه هو پریدم وسط کارتون، شرمنده.
ببخشید شما میدونید چه طور میتونم تو PostBack ی هه فایل رو تو پوشه سمت دایرکتوری ذخیره کنم؟؟؟ بهتر بگم، من دارم یه فرم ساز درست میکنم، fileUpload رو به صورت html تو PostBack درست میکنم ، حالا من آدرس فایل رو تو بانک ذخیره میکنم برای ذخیره خود فایل تو پوشه فایل هام مشکل برخوردم، (من با jh تا حالا با SaveAs فایل آپلود این کار رو میکردم الان نمیدونم باید چی کار کنم؟؟)هرچی Search میکنم چیزی پیدا نمیکنم، میتونین کمکم کنین؟؟؟/ ممنون میشم.سوالم رو هم پرسیدم ولی کسی تا حالا جواب نداده!!!!!

بازم معذرت میخوام وسط کارتون یه هو پریدم ، نخواستم یه پست جدید بزنم.

با تشکر فراوان.

fakhravari
شنبه 02 دی 1391, 12:26 عصر
خوب فخرآوری جان یه سوال جدید.
مشکل قبلیم حل شد.
الان میخوام یه سوال کنم ببینم این روشی که شما گفتی عملا میتونه جایگزین querystring باشه یا نه ؟؟؟(یعنی اگه بجای کووری استرینگ ازش استفاده کنیم منطقی و اصولیه؟)
100 % همین است.

fakhravari
شنبه 02 دی 1391, 12:28 عصر
سلام، ببخشید یه هو پریدم وسط کارتون، شرمنده.
ببخشید شما میدونید چه طور میتونم تو PostBack ی هه فایل رو تو پوشه سمت دایرکتوری ذخیره کنم؟؟؟ بهتر بگم، من دارم یه فرم ساز درست میکنم، fileUpload رو به صورت html تو PostBack درست میکنم ، حالا من آدرس فایل رو تو بانک ذخیره میکنم برای ذخیره خود فایل تو پوشه فایل هام مشکل برخوردم، (من با jh تا حالا با SaveAs فایل آپلود این کار رو میکردم الان نمیدونم باید چی کار کنم؟؟)هرچی Search میکنم چیزی پیدا نمیکنم، میتونین کمکم کنین؟؟؟/ ممنون میشم.سوالم رو هم پرسیدم ولی کسی تا حالا جواب نداده!!!!!

بازم معذرت میخوام وسط کارتون یه هو پریدم ، نخواستم یه پست جدید بزنم.

با تشکر فراوان.
به به به شما میگن مهمان ناخونده.
این کار دیگه نکن.
FileUpload1.PostedFile.SaveAs(Server.MapPath(@"~/Img/Users/") + txtusername.Text + ".jpg");

z_software
شنبه 02 دی 1391, 12:41 عصر
به به به شما میگن مهمان ناخونده.
این کار دیگه نکن.
FileUpload1.PostedFile.SaveAs(Server.MapPath(@"~/Img/Users/") + txtusername.Text + ".jpg");


ممنون که جوابم رو دادین ، لطف کردین .
بازم ببخشید تورو خدا، ولی من که به فایل آپلودم تو صفحه دسترسی ندارم اون رو دارم Generate میکنم .
من به کنترل هام که دسترسی ندارم ،فقط ازشون یه نوع دارم و یه اسم که تو دیتابیس ذخیره میشه، من با Request.Form اسم و مقدار کنترل هام رو دارم میخونم ، اسم عکسم رو هم تو بانک ذخیره میکنم ولی با ذخیره خود عکس مشکل دارم .

بازم معذرت میخوام، میتونین جوابم رو ندین ،(ولی اگه میدونین ... باور کنید دو روزه درگیر همین هستم دیگه دارم کلافه میشم )

(راستی مهمان حبیب خداست)
با تشکر فراوان.

saeed_sho
دوشنبه 11 دی 1391, 10:24 صبح
شرمنده سؤالم خیلی ضایع ست :گیج:
اون params که در حلقه استفاده کردین چیه؟ و از کجا آوردین؟

malloc
دوشنبه 11 دی 1391, 10:52 صبح
private NameValueCollection Params {
get
{
return inputValues;
}
}

یکم بالاتر از اون حلقه کد بالا رو نوشته . از اونجا میاد . تا اونجایی هم که من میدونم نقشش اینه که پارامترهایی که با تابع پاس میدی و ساپورت کنه . منظورم خط کد زیر هست :

remotePost.Add("MerchantID", "123456789");
remotePost.Add("Price", "10000");
remotePost.Add("WebSite", "fakhravary.blogfa.com");

آقای فخرآوری جان اگه اشتباه گفتم ختما تصحیح کنید

saeed_sho
دوشنبه 11 دی 1391, 10:59 صبح
شرمنده اصلا حواسم نبود :متعجب:

saeed_sho
یک شنبه 01 بهمن 1391, 17:39 عصر
آقای فخرآوری از نظر امنیتی این روش چقدر امنیت داره؟
منظورم اینه که روش امنی برای ارسال اطلاعات هست یا نه؟
لازم موقع ارسال داده هارو کد کنیم و موقع دریافت دیکد؟

fakhravari
یک شنبه 01 بهمن 1391, 20:37 عصر
تا جایی که میدونم این روش برای انتقال اطلاعات مهم بکار میره که تابع بالا از دید url مخفی میکنه
تا جایی که میدونم بانک ها هم از همین روش اطلاعات میفرستند.

taghi.km
دوشنبه 02 بهمن 1391, 09:44 صبح
البته با استفاده از افزونه های فایرفاکس(temper data) میشه به اطلاعات ارسالی از طریق پست هم دسترسی داشت

saeed_sho
دوشنبه 02 بهمن 1391, 14:28 عصر
تا جایی که میدونم این روش برای انتقال اطلاعات مهم بکار میره که تابع بالا از دید url مخفی میکنه
تا جایی که میدونم بانک ها هم از همین روش اطلاعات میفرستند.
ممنون از توضیحتون
لازمه اطلاعات موقع ارسال کد بشن؟

saeed_sho
دوشنبه 02 بهمن 1391, 14:30 عصر
البته با استفاده از افزونه های فایرفاکس(temper data) میشه به اطلاعات ارسالی از طریق پست هم دسترسی داشت
راه مقابله با اون افزونه چیه؟
دیتا رو کد کنیم حل میشه؟

taghi.km
دوشنبه 02 بهمن 1391, 17:44 عصر
کد کردن بهتره از اینه که کاری انجام ندید
ولی باید تو منطق برنامه به شدت داده هایی رو که بین صفحات منتقل میکنید بررسی کنید تا داده های جعلی وارد برنامه نشه

saeed_sho
جمعه 27 اردیبهشت 1392, 17:42 عصر
شما در پست اول یه فرم ساده درست کردین که داخلش یه input گذاشتین که دیتا رو میدین بهش اما فرم های پروژه واقعی داخل فرم تعداد زیادی دایو و انواع کنترل های مختلف داره که نمیشه کل صفحه رو با string در کد بیهایند نوشت اگه نخوایم کل صفحه رو با کد بنویسیم باید برای پست کردن دیتا از جاوااسکریپت استفاده کنیم؟
تفاوت این نوع ارسال یا previousPage که استفاده میشه چیه؟
ممنون میشم پاسخ بدین

AmirGhasemi
شنبه 28 اردیبهشت 1392, 10:12 صبح
جناي فخرآوري بسيار ممنون از آموزش شما
من در چندين پروژه ام از اين روس پست استفاده كرده ام و هميشه دعاگوي شما بوده ام
يك سوال؟!
بعد از پست كردن صفحه جديد روي همان تب مرورگر باز مي شود و به تب جديد نمي رود! من target="_blank" را در كدها در خصوصيات فرم اضافه كردم اما ايراد مي گيرد
به نظر شما چكار كنيم كه صفحه پست شده در تب جديد باز شود؟

fakhravari
یک شنبه 29 اردیبهشت 1392, 20:22 عصر
تست کردن جواب میده
var remotePost = new RemotePost("http://www.google.com");
remotePost.Add("MerchantID", "123456789");
remotePost.Post();
context.Response.Write(string.Format("<form name=\"{0}\" method=\"{1}\" action=\"{2}\" target=\"_blank\">", FormName, Method, Url));

saeed_sho
دوشنبه 30 اردیبهشت 1392, 18:03 عصر
لطفا جواب پست 31 رو هم بدید

fakhravari
یک شنبه 05 خرداد 1392, 14:44 عصر
میتونید از
<form method="POST" action="">

<p><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>
استفاده کنید
خب از روش جاوا اسکریپت هم میشه

fakhravari
شنبه 11 خرداد 1392, 17:58 عصر
در ابدیت پنل باید از این تریگر استفاده کنید
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="ثبت"
Width="92px" />
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="Button1" />
</Triggers>
</asp:UpdatePanel>

"emad"
پنج شنبه 30 خرداد 1392, 11:47 صبح
چطوری مشکل حا کردی؟

"emad"
پنج شنبه 30 خرداد 1392, 11:48 صبح
خوب فخرآوری جان یه سوال جدید.
مشکل قبلیم حل شد.
الان میخوام یه سوال کنم ببینم این روشی که شما گفتی عملا میتونه جایگزین querystring باشه یا نه ؟؟؟(یعنی اگه بجای کووری استرینگ ازش استفاده کنیم منطقی و اصولیه؟)

چطوری مشکل حا کردی؟