রেসপন্স.গ্রেটের পরিবর্তে POST দিয়ে পুনর্নির্দেশ করবেন?


248

আমাদের ফর্ম জমা দেওয়ার এবং কিছু তথ্য সংরক্ষণ করার প্রয়োজনীয়তা রয়েছে, তারপরে ব্যবহারকারীকে একটি পৃষ্ঠা অফসাইটে পুনর্নির্দেশ করুন, তবে পুনর্নির্দেশের ক্ষেত্রে আমাদের জিইটি নয়, পোস্টের সাথে একটি ফর্ম "জমা" করতে হবে।

আমি আশা করছিলাম এটি সম্পাদন করার একটি সহজ উপায় আছে তবে আমি ভাবতে শুরু করি যে এটি নেই। আমি মনে করি আমার এখন যে ফর্মটি চাই সেগুলি দিয়ে আমাকে অবশ্যই এটির একটি সহজ পৃষ্ঠা তৈরি করতে হবে, এটিতে পুনঃনির্দেশ করুন, ফর্মের ভেরিয়েবলগুলি পপুলেট করুন, তারপরে একটি বডি.অনলোড করুন এমন কোনও স্ক্রিপ্টে কল করুন যা কেবল ডকুমেন্ট.ফর্মগুলি কল করে 0 [0]। সাবমিট ( );

বিকল্প আছে কি কেউ আমাকে বলতে পারেন? আমাদের প্রকল্পটির পরে এটির জন্য টুইট করার দরকার হতে পারে এবং এটি জটিল আকার ধারণ করতে পারে, তাই যদি খুব সহজেই আমরা কিছু করতে পারি তবে এটি অ-অন্যান্য পৃষ্ঠা নির্ভর করে আমরা এটি করতে পারি যা দুর্দান্ত।

যাইহোক, যে কোনও এবং সমস্ত প্রতিক্রিয়ার জন্য ধন্যবাদ।


পিএইচপি-তে, আপনি সিআরএল সহ পোস্টের ডেটা প্রেরণ করতে পারেন। .NET এর সাথে তুলনামূলক কিছু আছে কি?
ব্রায়ান ওয়ারশা

আমি মনে করি এটি সেই সহজ উত্তর যা আপনি খুঁজছিলেন। আমি বিশ্বাস করতে পারছিলাম কিভাবে প্রতিভাশালী এটা ... stackoverflow.com/a/6062248/110549
JoeCool

আমি খুঁজে System.Net.Http.HttpClient @BrianWarshaw msdn.microsoft.com/en-us/library/... খুব স্বজ্ঞাত এবং দ্রুত ব্যবহার করতে।
স্টোয়ান ডিমোভ

উত্তর:


228

এটি করার জন্য এইচটিটিপি কীভাবে পুনঃনির্দেশ করে কাজ করে তা বোঝা দরকার। আপনি যখন ব্যবহার করেন Response.Redirect(), আপনি HTTP স্থিতি কোড 302 সহ একটি প্রতিক্রিয়া (অনুরোধটি জানিয়েছে এমন ব্রাউজারে) প্রেরণ করেন , যা ব্রাউজারকে কোথায় যেতে হবে তা বলে দেয়। সংজ্ঞা অনুসারে, ব্রাউজারটি একটি GETঅনুরোধের মাধ্যমে এটি তৈরি করবে , এমনকি যদি মূল অনুরোধটি ছিল একটি POST

আরেকটি বিকল্প হ'ল এইচটিটিপি স্থিতি কোড 307 ব্যবহার করা , যা উল্লেখ করে যে ব্রাউজারটি মূল অনুরোধের অনুরূপ পুনর্নির্দেশের অনুরোধটি করা উচিত, তবে ব্যবহারকারীকে সুরক্ষা সতর্কতা দিয়ে অনুরোধ করা উচিত। এটি করার জন্য, আপনি এই জাতীয় কিছু লিখবেন:

public void PageLoad(object sender, EventArgs e)
{
    // Process the post on your side   

    Response.Status = "307 Temporary Redirect";
    Response.AddHeader("Location", "http://example.com/page/to/post.to");
}

দুর্ভাগ্যক্রমে, এটি সর্বদা কার্যকর হবে না। বিভিন্ন ব্রাউজারগুলি এটিকে ভিন্নভাবে প্রয়োগ করে , কারণ এটি কোনও সাধারণ স্থিতি কোড নয়।

হায়, অপেরা এবং ফায়ারফক্স বিকাশকারীদের বিপরীতে, আইআই বিকাশকারীরা কখনই এই অনুমানটি পড়েনি এবং সর্বশেষতম সুরক্ষিত আই 77 কোনও সতর্কতা বা নিশ্চিতকরণ ডায়ালগ ছাড়াই ডোমেন এ থেকে ডোমেন বিতে POST অনুরোধটি পুনঃনির্দেশ করবে! সাফারি একটি আকর্ষণীয় উপায়েও কাজ করে, যখন এটি কোনও নিশ্চিতকরণ ডায়ালগ উত্থাপন করে না এবং পুনর্নির্দেশ সম্পাদন করে তবে এটি পোস্টের ডেটা ফেলে দেয়, কার্যকরভাবে 307 পুনর্নির্দেশকে আরও সাধারণ 302 এ পরিবর্তন করে।

সুতরাং, যতদূর আমি জানি, এর মতো কিছু বাস্তবায়নের একমাত্র উপায় হ'ল জাভাস্ক্রিপ্ট ব্যবহার করা। আমার মাথার উপরের অংশটি ভাবার জন্য দুটি বিকল্প রয়েছে:

  1. ফর্মটি তৈরি করুন এবং actionতৃতীয় পক্ষের সার্ভারে এর বৈশিষ্ট্যযুক্ত বিন্দু রাখুন। তারপরে, জমা বাটনে একটি ক্লিক ইভেন্ট যুক্ত করুন যা ডেটা দিয়ে প্রথমে আপনার সার্ভারে একটি এজেএক্স অনুরোধ কার্যকর করে এবং তারপরে ফর্মটি তৃতীয় পক্ষের সার্ভারে জমা দেওয়ার অনুমতি দেয়।
  2. আপনার সার্ভারে পোস্ট করতে ফর্ম তৈরি করুন। ফর্মটি জমা দেওয়া হলে, লুকানো ইনপুটগুলিতে আপনি যে সমস্ত ডেটা পাস করতে চান তার সাথে একটি ফর্ম থাকা ব্যবহারকারীকে এমন একটি পৃষ্ঠা দেখান। কেবল "পুনর্নির্দেশ ..." এর মতো একটি বার্তা দেখান। তারপরে, পৃষ্ঠাটিতে একটি জাভাস্ক্রিপ্ট ইভেন্ট যুক্ত করুন যা ফর্মটি তৃতীয় পক্ষের সার্ভারে জমা দেয়।

দু'জনের মধ্যে আমি দ্বিতীয়টি বেছে নেব, দুটি কারণে। প্রথমত, এটি প্রথমটির চেয়ে বেশি নির্ভরযোগ্য কারণ এটি কাজ করার জন্য জাভাস্ক্রিপ্টের প্রয়োজন হয় না; যাদের এটি সক্ষম নেই তাদের জন্য, আপনি সর্বদা লুকানো ফর্মটির জন্য জমা বোতামটি দৃশ্যমান করতে পারেন এবং এটি যদি 5 সেকেন্ডের বেশি সময় নেয় তবে এটি টিপতে নির্দেশ দিন। দ্বিতীয়ত, আপনি সিদ্ধান্ত নিতে পারেন কোন তৃতীয় পক্ষের সার্ভারে ডেটা সংক্রমণিত হয়; আপনি যদি ফর্মটি যেমন যান ঠিক তেমন প্রক্রিয়া ব্যবহার করেন তবে আপনি সমস্ত পোস্ট ডেটা দিয়ে যাবেন যা আপনি যা চান তা সবসময় হয় না। 307 সমাধানের জন্য একই, ধরে নিচ্ছেন এটি আপনার সমস্ত ব্যবহারকারীর জন্য কাজ করেছে।

আশাকরি এটা সাহায্য করবে!


1
দয়া করে, "ফর্মের সাথে জমা দেওয়ার ইভেন্ট যুক্ত করুন" "সাবমিট বাটনে একটি ক্লিক ইভেন্ট যুক্ত করুন" পরিবর্তন করুন। ফর্ম জমা দেওয়ার জন্য একাধিক পদ্ধতি রয়েছে, যেমন কোনও পাঠ্য ইনপুটকে কেন্দ্র করে এন্টার টিপুন, প্রোগ্রাম্যাটিক জমা দিন।
temoto

122

আপনি এই aproach ব্যবহার করতে পারেন:

Response.Clear();

StringBuilder sb = new StringBuilder();
sb.Append("<html>");
sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
sb.AppendFormat("<form name='form' action='{0}' method='post'>",postbackUrl);
sb.AppendFormat("<input type='hidden' name='id' value='{0}'>", id);
// Other params go here
sb.Append("</form>");
sb.Append("</body>");
sb.Append("</html>");

Response.Write(sb.ToString());

Response.End();

ফলে অধিকার ক্লায়েন্ট পরে এইচটিএমএল সার্ভার থেকে ঘটনা পাবেন onload স্থান, যা ট্রিগার জমা দিতে ও সংজ্ঞায়িত postbackUrl সমস্ত ডেটাকে পোষ্ট রূপ নিতে।


9
+1 (আমি পারলে আপনাকে আরও বেশি করে দিতাম)। এই উত্তর। সুস্পষ্ট এবং বিন্দু। এমনকি আপনি নিজের মাথার উপরে কথা বলার পরিবর্তে এটি করার জন্য সমস্ত কোড অন্তর্ভুক্ত করেছেন। আমি এটি আমার এসপেক্স পৃষ্ঠায় একটি আইফ্রেমে ব্যবহার করেছি এবং এটি সবকিছুকে নিখুঁতভাবে রেন্ডার করেছে - কোনও পুনর্লিখনের url নয়। চমৎকার কাজ! আইফ্রেমে ব্যবহারকারীদের জন্য টিপ: আমি আমার আইফ্রেমে অন্য এসপেক্স পৃষ্ঠায় নির্দেশ করি যা এই কোডটি কার্যকর করে।
মাইকটাইভি

1
এটা কাজ করে! কেবলমাত্র খারাপ জিনিসটি আমি দেখতে পাচ্ছি যে আপনি যদি ব্রাউজারের পিছনের বোতামটি চাপান তবে এটি আবার অনুরোধ করে, সুতরাং আপনি আর আগের পৃষ্ঠায় পৌঁছাতে পারবেন না। তার জন্য কি কোনও কাজের ক্ষেত্র নেই?
মাউন্ট স্নাইডার্স

4
এটি করার জন্য সমর্থিত পদ্ধতিটি 307 ব্যবহার করার একটি কারণ রয়েছে P এই উত্তরটি কেবল একটি হ্যাক যা কাজ করে এবং ভবিষ্যতে ব্রাউজারগুলির দ্বারা খুব সহজেই অবরুদ্ধ করা যায়।
স্যাম রুয়েবি

2
@ সাম পয়েন্ট পাল্টা যুক্তি হিসাবে: শীর্ষস্থানীয় উত্তর অনুসারে আইই বিকাশকারী প্রায় 307 পড়েনি। অন্য যারা এটি পড়েছেন তারা এটি ভুলভাবে প্রয়োগ করেছেন। এর অর্থ 307 স্পষ্টভাবে স্মার্টগুলিকে বিভ্রান্ত করছে (ধরে নিচ্ছেন ব্রাউজার বিকাশকারীরা স্মার্ট) এবং ব্যাখ্যা ত্রুটির প্রবণতা। উপরোক্ত পদ্ধতির বিষয়টি পরিষ্কার, কমপক্ষে আমার কাছে এবং এটি অতীত এবং বর্তমান সমস্ত ব্রাউজারগুলিতে কাজ করে। ভবিষ্যতের বিষয়ে খুব বেশি চিন্তিত নন যেহেতু আমরা বিকাশকারীরা অতীতের সাথে লড়াই করে (আইই 7 পড়ুন) এবং বর্তমান দিনটি বাইরে / বাইরে। আইএমএইচও, যেহেতু প্রত্যেকে এটি সঠিকভাবে পেয়েছে তাদের উচিত এটি যেমন আছে তেমনই রাখা উচিত। ভবিষ্যতে এটি অবরুদ্ধ করার যৌক্তিকতা কী হবে?
so_mv

2
এটি কীভাবে কার্যকরভাবে টিজিএইচডাব্লু দ্বারা দ্বিতীয় বিকল্পের মতো নয়? আপনি কি এক্সএসএস দুর্বলতার পরিচয় দেওয়ার জন্য অসতর্ক কাউকে জিজ্ঞাসা করছেন না?
স্কট

33

এইটির জন্য এইচটিটিপিওয়েবরেইকস্ট ব্যবহৃত হয়।

পোস্টব্যাকে, আপনার তৃতীয় পক্ষের জন্য একটি HTTPWebRequest তৈরি করুন এবং ফর্ম ডেটা পোস্ট করুন, তারপরে এটি হয়ে গেলে, আপনি প্রতিক্রিয়া জানাতে পারেন wherever যেখানে আপনি চান পুনর্নির্দেশ করতে পারেন।

আপনি অতিরিক্ত সুবিধা পেয়েছেন যে তৃতীয় পক্ষগুলি ফর্ম তৈরি করতে আপনার সমস্ত সার্ভারের নিয়ন্ত্রণের নাম দিতে হবে না, POST স্ট্রিং তৈরি করার সময় আপনি এই অনুবাদটি করতে পারেন।

string url = "3rd Party Url";

StringBuilder postData = new StringBuilder();

postData.Append("first_name=" + HttpUtility.UrlEncode(txtFirstName.Text) + "&");
postData.Append("last_name=" + HttpUtility.UrlEncode(txtLastName.Text));

//ETC for all Form Elements

// Now to Send Data.
StreamWriter writer = null;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";                        
request.ContentLength = postData.ToString().Length;
try
{
    writer = new StreamWriter(request.GetRequestStream());
    writer.Write(postData.ToString());
}
finally
{
    if (writer != null)
        writer.Close();
}

Response.Redirect("NewPage");

যাইহোক, যদি এই ফর্মটি থেকে আপনার প্রতিক্রিয়া পৃষ্ঠাটি দেখতে ব্যবহারকারী প্রয়োজন হয় তবে আপনার একমাত্র বিকল্প হ'ল সার্ভার.টান্সফার ব্যবহার করা এবং এটি কাজ করতে পারে বা নাও করতে পারে।


আমি যদি এসপি নেট ফর্মের চেয়ে অতিরিক্ত ফর্ম চাই তবে আমি এটি ব্যবহার করতে যাচ্ছি। আমাকে একটি বাহ্যিক url- এ কিছু ডেটা পোস্ট করতে হবে যা 3 ডি সুরক্ষিত অর্থপ্রদানের জন্য, তারপরে আমার অনুরোধটি থেকে তথ্য ফিরে পাওয়া দরকার। এটা কি এই উপায়? আপনাকে ধন্যবাদ
বার্বারোস অ্যাল্প

আপনার প্রতিক্রিয়াটি দেখতে যদি ব্যবহারকারী প্রয়োজন হয় তবে আপনি কেবল সামগ্রী এবং কোনও উপযুক্ত শিরোনাম ফিরিয়ে দিতে পারেন। আপেক্ষিক সংস্থান ব্যবহারের উপর নির্ভর করে আপনাকে ফলাফলের কয়েকটি দিক সংশোধন করতে হতে পারে, তবে এটি অবশ্যই সম্ভব।
থমাস এস ট্রায়াস

6
ব্যবহারকারীর কাছে কুকি ডেটা থাকতে পারে যা এই পদ্ধতির মাধ্যমে সংক্রমণিত হবে না, কারণ এটি সার্ভার থেকে ঘটছে।
স্কট

7

এটি জীবনকে আরও সহজ করে তুলবে। আপনি সহজেই আপনার ওয়েব অ্যাপ্লিকেশনটিতে রেসপন্স.ড্রেইটারটুইট ডেটা (...) পদ্ধতিটি সহজেই ব্যবহার করতে পারেন।

Imports System.Web
Imports System.Runtime.CompilerServices

Module WebExtensions

    <Extension()> _
    Public Sub RedirectWithData(ByRef aThis As HttpResponse, ByVal aDestination As String, _
                                ByVal aData As NameValueCollection)
        aThis.Clear()
        Dim sb As StringBuilder = New StringBuilder()

        sb.Append("<html>")
        sb.AppendFormat("<body onload='document.forms[""form""].submit()'>")
        sb.AppendFormat("<form name='form' action='{0}' method='post'>", aDestination)

        For Each key As String In aData
            sb.AppendFormat("<input type='hidden' name='{0}' value='{1}' />", key, aData(key))
        Next

        sb.Append("</form>")
        sb.Append("</body>")
        sb.Append("</html>")

        aThis.Write(sb.ToString())

        aThis.End()
    End Sub

End Module

6

এএসপি.নেট 3.5 তে নতুন কিছু হ'ল এএসপি বোতামগুলির এই "পোস্টব্যাকআরল" সম্পত্তি। আপনি সরাসরি যে পৃষ্ঠায় পোস্ট করতে চান তার ঠিকানায় এটি সেট করতে পারেন, এবং যখন সেই বোতামটি ক্লিক করা হয়, স্বাভাবিকের মতো একই পৃষ্ঠায় ফিরে পোস্ট করার পরিবর্তে, এটি আপনার নির্দেশিত পৃষ্ঠায় পোস্ট করে। কুশলী। নিশ্চিত হয়ে নিন যে UseSubmitBehaviourও সত্যে সেট করা আছে।


4

ভেবেছিলাম এটি আকর্ষণীয় হতে পারে যে হিরকু এটির জন্য এসএসও এর সাথে অ্যাড-অন সরবরাহকারীদের সাথে এটি করে

এটি কীভাবে কাজ করে তার একটি উদাহরণ উত্সে "কেনসা" সরঞ্জামটিতে দেখা যেতে পারে:

https://github.com/heroku/kensa/blob/d4a56d50dcbebc2d26a4950081acda988937ee10/lib/heroku/kensa/post_proxy.rb

আপনি জাভাস্ক্রিপ্ট চালু করলে অনুশীলনে দেখা যাবে। পৃষ্ঠা উত্স উদাহরণ:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Heroku Add-ons SSO</title>
  </head>

  <body>
    <form method="POST" action="https://XXXXXXXX/sso/login">

        <input type="hidden" name="email" value="XXXXXXXX" />

        <input type="hidden" name="app" value="XXXXXXXXXX" />

        <input type="hidden" name="id" value="XXXXXXXX" />

        <input type="hidden" name="timestamp" value="1382728968" />

        <input type="hidden" name="token" value="XXXXXXX" />

        <input type="hidden" name="nav-data" value="XXXXXXXXX" />

    </form>

    <script type="text/javascript">
      document.forms[0].submit();
    </script>
  </body>
</html>

3

পোস্টব্যাকআরএল একটি ভিন্ন পৃষ্ঠায় পোস্ট করার জন্য আপনার এসপ বোতামে সেট করা যেতে পারে।

আপনার যদি কোডবিহাইডে এটি করার দরকার হয় তবে সার্ভার.টান্সফার চেষ্টা করুন।


2

@Matt,

আপনি এখনও HTTPWebRequest ব্যবহার করতে পারেন, তারপরে আপনি যে প্রতিক্রিয়াটি প্রকৃত আউটপুট স্ট্রিম প্রতিক্রিয়াটিতে পৌঁছেছেন তা সরাসরি পরিচালনা করুন, এটি প্রতিক্রিয়াটি ব্যবহারকারীর কাছে ফিরিয়ে আনবে। একমাত্র সমস্যা হ'ল যে কোনও আপেক্ষিক url নষ্ট হয়ে যাবে।

তবুও, এটি কাজ করতে পারে।


2

আমি যা করব তা এখানে:

ডেটাটিকে একটি স্ট্যান্ডার্ড ফর্মে রাখুন (কোনও রানাত = "সার্ভার" বৈশিষ্ট্য ছাড়াই) এবং ফর্মটির ক্রিয়াটি লক্ষ্যবশত অফ-পৃষ্ঠা পৃষ্ঠায় পোস্ট করতে সেট করুন। জমা দেওয়ার আগে আমি এক্সএমএলএইচটিপিআরকোয়েস্ট ব্যবহার করে আমার সার্ভারে ডেটা জমা দেব এবং প্রতিক্রিয়াটি বিশ্লেষণ করব। যদি প্রতিক্রিয়াটির অর্থ আপনার অফসাইট পোস্টিং নিয়ে এগিয়ে যাওয়া উচিত তবে আমি (জাভাস্ক্রিপ্ট) পোস্টটি নিয়ে এগিয়ে যাব অন্যথায় আমি আমার সাইটের কোনও পৃষ্ঠাতে পুনর্নির্দেশ করব


এটি কাজ করে তবে আপনার এএসপি.এনইটি সার্ভার-সাইড কার্যকারিতাটি looseিলা করে রাখা গুরুত্বপূর্ণ note
সেনফো

2

পিএইচপি-তে, আপনি সিআরএল সহ পোস্টের ডেটা প্রেরণ করতে পারেন। .NET এর সাথে তুলনামূলক কিছু আছে কি?

হ্যাঁ, HttpWebRequest, নীচে আমার পোস্ট দেখুন।


2

জিইটি (এবং হেড) পদ্ধতিটি এমন কোনও কিছু করতে কখনই ব্যবহার করা উচিত নয় যার পার্শ্ব প্রতিক্রিয়া রয়েছে। কোনও পার্শ্ব-প্রতিক্রিয়া হতে পারে কোনও ওয়েব অ্যাপ্লিকেশনের স্থিতি আপডেট করা, বা এটি আপনার ক্রেডিট কার্ড চার্জ করা হতে পারে। যদি কোনও ক্রিয়ায় পার্শ্ব-প্রতিক্রিয়া থাকে তবে এর পরিবর্তে অন্য একটি পদ্ধতি (POST) ব্যবহার করা উচিত।

সুতরাং, কোনও জিইটি দ্বারা কোনও কিছুর জন্য কোনও ব্যবহারকারীকে (বা তাদের ব্রাউজার) জবাবদিহি করা উচিত নয়। জিইটি-এর ফলাফল হিসাবে যদি কিছু ক্ষতিকারক বা ব্যয়বহুল পার্শ্ব-প্রতিক্রিয়া দেখা দেয় তবে এটি ওয়েব অ্যাপ্লিকেশনটির দোষ হবে, ব্যবহারকারী নয়। অনুমান অনুসারে, কোনও ব্যবহারকারী এজেন্ট অবশ্যই কোনও জিইটি বা হেড অনুরোধের প্রতিক্রিয়া না থাকলে স্বয়ংক্রিয়ভাবে পুনঃনির্দেশকে অনুসরণ করতে হবে না

অবশ্যই এটি অনেকগুলি জিইটি অনুরোধের কিছু পার্শ্ব-প্রতিক্রিয়া রয়েছে, এমনকি এটি লগ ফাইলটিতে সংযুক্ত হলেও। গুরুত্বপূর্ণ বিষয় হ'ল অ্যাপ্লিকেশনটি, ব্যবহারকারী নয়, এই প্রভাবগুলির জন্য দায়বদ্ধ হওয়া উচিত।

HTTP স্পেসের সম্পর্কিত বিভাগগুলি 9.1.1 এবং 9.1.2 , এবং 10.3


1

আমি আপনার পোস্টটি প্রোগ্রামিয়েটিক্যালি কার্যকর করার জন্য একটি এইচটিটিপিওয়েবরেউয়েস্ট তৈরি করার পরামর্শ দিচ্ছি এবং তারপরে প্রযোজ্য ক্ষেত্রে প্রতিক্রিয়াটি পড়ে পুনর্নির্দেশ করুন।


1

পাভলো নেইম্যানের পদ্ধতির উপর ভিত্তি করে অনুলিপি-পেষ্টযোগ্য কোড

রিডাইরেক্টপোস্ট (স্ট্রিং ইউআরএল, টি বডিপায়লোড) এবং গেটপোস্টডেটা () তাদের জন্য যারা কেবল উত্স পৃষ্ঠায় কিছু দৃ strongly়ভাবে টাইপ করা ডেটা ডাম্প করতে চান এবং এটি লক্ষ্যবস্তুতে ফিরে আনতে চান। ডেটা অবশ্যই নিউটনসফট জসন.এনইটি দ্বারা সিরিয়ালাইজেবল হতে হবে এবং আপনার অবশ্যই অবশ্যই গ্রন্থাগারটি উল্লেখ করতে হবে।

আপনার পৃষ্ঠাগুলির জন্য কেবল আপনার পৃষ্ঠাগুলিতে বা আরও ভাল বেস ক্লাসে অনুলিপি করুন এবং এটি আপনার আবেদনের যে কোনও জায়গায় ব্যবহার করুন।

আমার হৃদয় আপনার সকলের কাছে পৌঁছে গেছে যাকে এখনও যে কোনও কারণেই 2019 সালে ওয়েব ফর্মগুলি ব্যবহার করতে হবে।

        protected void RedirectPost(string url, IEnumerable<KeyValuePair<string,string>> fields)
        {
            Response.Clear();

            const string template =
@"<html>
<body onload='document.forms[""form""].submit()'>
<form name='form' action='{0}' method='post'>
{1}
</form>
</body>
</html>";

            var fieldsSection = string.Join(
                    Environment.NewLine,
                    fields.Select(x => $"<input type='hidden' name='{HttpUtility.UrlEncode(x.Key)}' value='{HttpUtility.UrlEncode(x.Value)}'>")
                );

            var html = string.Format(template, HttpUtility.UrlEncode(url), fieldsSection);

            Response.Write(html);

            Response.End();
        }

        private const string JsonDataFieldName = "_jsonData";

        protected void RedirectPost<T>(string url, T bodyPayload)
        {
            var json = JsonConvert.SerializeObject(bodyPayload, Formatting.Indented);
            //explicit type declaration to prevent recursion
            IEnumerable<KeyValuePair<string, string>> postFields = new List<KeyValuePair<string, string>>()
                {new KeyValuePair<string, string>(JsonDataFieldName, json)};

            RedirectPost(url, postFields);

        }

        protected T GetPostData<T>() where T: class 
        {
            var urlEncodedFieldData = Request.Params[JsonDataFieldName];
            if (string.IsNullOrEmpty(urlEncodedFieldData))
            {
                return null;// default(T);
            }

            var fieldData = HttpUtility.UrlDecode(urlEncodedFieldData);

            var result = JsonConvert.DeserializeObject<T>(fieldData);
            return result;
        }

0

সাধারণত, আপনার যা যা দরকার তা হ'ল এই দুটি অনুরোধের মধ্যে কিছুটা রাজ্য বহন করা। এটি করার সত্যিই একটি মজাদার উপায় রয়েছে যা জাভাস্ক্রিপ্টের উপর নির্ভর করে না (মনে করুন <noscript />)।

Set-Cookie: name=value; Max-Age=120; Path=/redirect.html

সেই কুকির সাহায্যে, আপনি নীচের অনুরোধে /redirect.html নাম = মান তথ্য পুনরুদ্ধার করতে পারেন, আপনি 4K ডেটা (সাধারণ কুকির সীমা) বলার জন্য এই নাম / মান জোড় স্ট্রিংয়ে কোনও ধরণের তথ্য সঞ্চয় করতে পারেন। অবশ্যই আপনার এড়ানো উচিত এবং পরিবর্তে স্থিতি কোড এবং পতাকা বিটগুলি সংরক্ষণ করা উচিত।

এই অনুরোধটি পাওয়ার পরে আপনি তার স্থিতি কোডের জন্য একটি মুছে ফেলার অনুরোধের বিনিময়ে প্রতিক্রিয়া জানান।

Set-Cookie: name=value; Max-Age=0; Path=/redirect.html

আমার এইচটিটিপি কিছুটা মরিচা, আমি সত্যই কতটা নির্ভরযোগ্য এটি নির্ধারণ করার জন্য ট্রাফ আরএফসি 2109 এবং আরএফসি 2965 যাচ্ছি, আমি কুকি ঠিক একবারে ভ্রমণ করতে চাই তবে তা তৃতীয় পক্ষের কুকিজ বলে মনে হয় না আপনি যদি অন্য কোনও ডোমেনে স্থান পরিবর্তন করছেন তবে আপনার জন্য সমস্যা হতে পারে। এটি এখনও সম্ভব তবে ততটা বেদনাদায়ক নয় যেমন আপনি নিজের ডোমেনের মধ্যে জিনিসগুলি করছেন।

এখানে সমস্যা হ'ল সামঞ্জস্য, যদি কোনও বিদ্যুত ব্যবহারকারী একাধিক ট্যাব ব্যবহার করে এবং একই সেশনের কয়েকটি অনুরোধ অনুরোধ করে (এটি খুব অসম্ভব, তবে অসম্ভব নয়) এটি আপনার অ্যাপ্লিকেশনটিতে অসঙ্গতি সৃষ্টি করতে পারে।

এটি অর্থহীন ইউআরএল এবং জাভাস্ক্রিপ্ট ছাড়াই এইচটিটিপি রাউন্ড ট্রিপগুলি করার <নোগ্রিপ্ট /> উপায়

আমি এই কোডটি ধারণার প্রোফেসর হিসাবে সরবরাহ করি: যদি এই কোডটি এমন একটি প্রসঙ্গে চালানো হয় যা আপনি পরিচিত নন তবে আমি মনে করি আপনি কোন অংশটি কী তা কাজ করতে পারেন।

ধারণাটি হ'ল আপনি পুনর্নির্দেশের সময় আপনি কিছু রাজ্যের সাথে রিলোকটকে কল করেন এবং আপনি যে ইউআরএল স্থানান্তরিত করেছিলেন সেটিকে ডেটা পেতে (যদি থাকে) গেটস্টেটকে কল করে।

const string StateCookieName = "state";

static int StateCookieID;

protected void Relocate(string url, object state)
{
    var key = "__" + StateCookieName + Interlocked
        .Add(ref StateCookieID, 1).ToInvariantString();

    var absoluteExpiration = DateTime.Now
        .Add(new TimeSpan(120 * TimeSpan.TicksPerSecond));

    Context.Cache.Insert(key, state, null, absoluteExpiration,
        Cache.NoSlidingExpiration);

    var path = Context.Response.ApplyAppPathModifier(url);

    Context.Response.Cookies
        .Add(new HttpCookie(StateCookieName, key)
        {
            Path = path,
            Expires = absoluteExpiration
        });

    Context.Response.Redirect(path, false);
}

protected TData GetState<TData>()
    where TData : class
{
    var cookie = Context.Request.Cookies[StateCookieName];
    if (cookie != null)
    {
        var key = cookie.Value;
        if (key.IsNonEmpty())
        {
            var obj = Context.Cache.Remove(key);

            Context.Response.Cookies
                .Add(new HttpCookie(StateCookieName)
                { 
                    Path = cookie.Path, 
                    Expires = new DateTime(1970, 1, 1) 
                });

            return obj as TData;
        }
    }
    return null;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.