ارسال اطلاعات از طریق روش Post
  در این ترفند کلاسی خواهیم نوشت که ارسال اطلاعات از طریق روش Post را به راحت ترین شکل ممکن امکان پذیر نماید.
   ASP.NET
   ۲۵۱۸۷
   دانلود
   مرتضی صحراگرد
   ۱۳۸۹/۹/۲۶
ارسال لینک صفحه برای دوستان ارسال لینک صفحه برای دوستان  اضافه کردن به علاقه مندیها اضافه کردن به علاقه مندیها   نسخه قابل چاپ نسخه قابل چاپ

 

مقدمه:

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

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

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

با توجه به اینکه ارسال اطلاعات از طریق Post امروزه رواج زیادی پیدا کرده است و بسیاری از بانک های ایرانی و خارجی هم اکنون از این روش برای دریافت اطلاعات استفاده می کنند، در این مقاله به بررسی این موضوع خواهیم پرداخت.

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

برای حل این مشکل  از روش های مختلفی استفاده می شود. یک روش این است که با استفاده از زبان جاوا اسکریپت و HTML یک فرم را به صورت داینامیک ایجاد نموده و همراه با دستور submit در صفحه بنویسیم.

اما گاهی نیاز است که دستور Post شدن اطلاعات را از درون یک کلاس یا کتابخانه ای که حتی در یک لایه فیزیکی متفاوت (Tire) قرار دارد صادر کنیم.

هم اکنون کلاسی خواهیم نوشت که انجام عمل Post نمودن اطلاعات را به راحت ترین شکل ممکن امکان پذیر می نماید.

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("http://www.Sample.com/RemotePage.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"];

قطعه کد کامل این مقاله از طریق لینک بالای صفحه قابل دریافت می باشد.