ユーザーが注文を送信するページがあり、ユーザーが注文を送信した後、http://externalsite.com?id=12345&sessionid=abc123
実際に外部ページにリダイレクトせずにURL()をヒットしたいと思います。
これを行う方法はありますか?
もちろん、HttpWebRequest
サーバー側のコードからを使用してください。次に例を示します。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
"http://externalsite.com?id=12345&sessionid=abc123");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// Process the response text if you need to...
}
ユーザーのCookie(ログインの詳細およびその他のユーザー設定)が必要な場合は、または偽の画像http://externalsite.com/
を埋め込んだり、ユーザーのブラウザーからajaxリクエストを使用したりできます。<iframe>
を使用する<iframe>
:
<iframe src="http://externalsite.com?id=12345&sessionid=abc123" width="1" height="1" frameborder="0"></iframe>
「偽の」画像リクエストの使用(潜在的な画像タイプの問題を無視できる場合):
<img src="http://externalsite.com?id=12345&sessionid=abc123" width="1" height="1" />
jQueryのクロスブラウザーajaxサポートを最も単純な形式で使用する:
$.ajax({
url: "http://externalsite.com?id=12345&sessionid=abc123"
});
追加のフォーマットを適用してiframeまたは画像を非表示にしたり、他のサーバーにアクセスする目的を果たしたときにjavascriptを使用して削除したりすることもできます。
WebClientクラスを使用して、サーバー側のAsp.NetコードでHTTP要求を発行できます。その後、結果のhtmlを使用して好きなことを行うことができます。
voithosとJoelPurraからの上記の2つの答えを組み合わせて、3番目の選択肢も検討することをお勧めします。以下はそれぞれの私の評価です:
1)サイトにアクセスするためのより確実な方法は、ユーザーの情報を実際に送信するためのアクションハンドラーの一部としてサーバー側で実行することです。これは、上記のvoithosの方法で簡単に実行できます。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
"http://externalsite.com?id=12345&sessionid=abc123");
request.Method = "GET";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
string result = reader.ReadToEnd();
// Process the response text if you need to...
}
これにより、サーバーがサーバーにアクセスし、確実に呼び出されるようになります。このアプローチの欠点は、サーバーにセカンダリHTTPリクエストのオーバーヘッドが発生することです。他のサーバーが遅い場合、これはブロッキングの問題を引き起こし、あなたの側で明らかに遅くなる可能性があります。マルチスレッド/非同期を使用することでこれを回避できますが、全体像を把握できます。これにより、制御できない問題が多数発生しますが、リモートソースがヒットしたかどうかを確認できます。返事は何でしたか。
2)または、ユーザーが実際の投稿を行い、新しいページとしてHTML応答を返す場合は、Joel Purraの応答をその結果のページのHTMLに挿入するだけで、ユーザーのブラウザーにリモートサーバーへのアクセスを強制できます。
<div style="display: none;">
<iframe src="http://externalsite.com?id=12345&sessionid=abc123"></iframe>
</div>
このアプローチの欠点は、何らかの理由でクライアントがリクエストを起動し、次のページが読み込まれるのを待たない場合、外部サイトが404エラーなどを返すだけでなく、外部処理が実行されないことです。あなたはそれが成し遂げられなかったことを知らないでしょう。
3)jQueryなどのクライアント側ライブラリを使用して処理を行うことができる場合は、すべてのフォーム送信をインラインで非同期に行うことをお勧めします。アプローチは次のようになります。
<script type="text/javascript">
$(document).bind('ready', function () {
$('#formSubmitButton').bind('click', function (ev) {
ev.preventDefault(); // These two lines stop the default processing from
ev.stopPropagation(); // occurring on form-submit (i.e. no full post-back)
// This line starts an asynchronous call to the server, posting your form
// data itself.
$.ajax({
url: '/My/Post/Url',
type: 'POST',
async: false,
// You could use a library for this kind of form parsing. I suggest
// http://www.json.org/js.html - for serialization, and
// http://code.google.com/p/form2js/ - for form conversion. It's great.
data: { my: 'form', data: 'fields' },
success: function (data) {
$.ajax({
url: '/The/External/Url',
type: 'POST',
async: false,
data: { external: 'data', goes: 'here' },
success: function (remoteData) {
if (remoteData) // validate response here
displaySuccess();
else
displayFailure();
},
error: displayFailure
});
},
error: displayFailure
});
});
});
</script>
この方法では、自分のサーバーに投稿し、成功するとすぐにリモートサーバーへの2番目のリクエストを実行します。ただし、2番目のリクエストが既に実行されるまでユーザーに成功/失敗を表示するのを待つため、少なくともUIレイヤーでは、クライアントがページを離れるキューを取得する前に両方のリクエストが行われていることがわかります。
したがって、ワークフローとオーバーヘッドの観点からはおそらくより安全ですが、JavaScriptでUIレベルのロジックを作成する必要があります。これは、プロジェクトによっては問題になる可能性があります。