2010-11-25 3 views
8

WebRequestを使用してSilverlightアプリケーションと同じWebサイトのWebページにHTTP POST要求を行うSilverlight(v3)アプリケーションがあります。このHTTPリクエストは、同じWebサイトの別のページに302(リダイレクト)を返します。HttpWebRequestは、自動的に(according to the documentation)とされます。HttpWebRequestは、Internet Explorerで302の404を返す

要求を(それがブラウザのHTTPスタックを使用し、別の作り付けのSilverlightのHTTPスタックを使用するように設定されていない)を行うコードについて特に特別なものは何もありません:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(String.Format("{0}?name={1}&size={2}", _UploadUrl, Uri.EscapeUriString(Name), TotalBytes)); 
request.Method = "POST"; 

すべてこれはFirefoxで正常に動作しますとクロム; SilverlightはPOST HTTPリクエストを作成し、302のレスポンスを受信し、指定されたリダイレクトURLのGET HTTPリクエストを自動的に行い、それを私に返します(これはHTTPリクエストの処理をFiddlerで行ったためです)。 ただし、Internet Explorer(v8)では、SilverlightがPOST HTTP要求を行い、404エラーコードでWebExceptionをスローします。

Fiddlerを使用すると、Silverlight/Internet Explorerが要求の302ステータスコードを正常に返すことがわかりました。私がSilverlightで取得した404ステータスコード(および関連WebException)は、ブラウザースタックを介して行われるHTTP要求は、制限のために200または404だけを返すことができます。実際の質問はで、他のブラウザのようにInternet Explorerがリダイレクトしないのはなぜですか?

ありがとうございました!

EDIT:それによって発行された私の知識の要求に批判的I ASP.NET認証Cookieなど、ブラウザのセッションの一部であるクッキーを、含まれていないので、私はSilverlightのクライアントHTTPスタックを使用しないだろうSilverlightコントロールによって行われているHTTP要求にアタッチする必要があります。

EDIT 2:私は、Internet ExplorerがPOST要求を行うときにのみこの動作を行うことを発見しました。 GETリクエストは正常にリダイレクトされます。これは、Post-Redirect-GetスタイルでいくつのWebサイトが現在何をしているかを考えると、かなり悪い振る舞いのようです。

この奇妙な動作を示す単純なdemo VS2008 solutionを作成しました。基本的なASP.NET MVC 1プロジェクトとSilverlight 3プロジェクトが含まれています。 WebサイトのSilverlightControlTestPage.htmlページに移動して、問題の実際の状況を確認します。

+0

リダイレクトされたURLは、POSTされたサーバーとXapから来たリソースを指していますか? – AnthonyWJones

+0

私が知る限り、ChromeとFirefoxは資格情報を別々に扱うかもしれません。資格情報について何かありますか?要求されたURLは匿名または認証された要求を受け入れますか? HTTPコードのサーバーアクセスログを確認しましたか? – JoeBilly

+0

クライアントHTTP処理機能を使用できますか?そうすれば、すべてのステータスコードにアクセスできます。 http://msdn.microsoft.com/en-us/library/cc838250(v=VS.95).aspx – feroze

答えて

0

これはInternet Explorer 7の機能変更で、予想される200応答を302に変更してIEのリダイレクトを指示したと考えています。私が知っているこの問題に対する円滑な解決策はありません。同じような質問がありましたが、後でhereです。

Change in behavior with Internet Explorer 7 and later in regard to CONNECT requests

+0

私の問題はこれに関連しているとは思わない。あなたがリンクしているブログ記事は、その動作がCONNECTリクエスト(つまりHTTPS)のためのものだと言います。私の要求はすべて通常のHTTPで行われます。 –

3

IEは、(それがユーザの確認なしにこれを行うべきではないが)ユーザエージェントがPOSTを送信するポスト302に応答における点で、仕様に近いです。

一方、FFとChromeは、ユーザーエージェントがかなり前に間違っていた(HTTPの初期に問題が起きた)という方法をコピーする際に意図的に間違っています。

このため、同じHTTPメソッドを使用する必要があることを明確にするために、HTTP/1.1に307が導入されました。この場合、POSTでなければなりません)、303は常にGETを使用する必要があることを意味しています。

Response.Redirectを実行する代わりに、異なるユーザーエージェントがさまざまな方法で処理する302という結果になります。次のコードは、303を送信します(有効なエンティティ本体が含まれています。スペック)。

private void SeeOther(Uri uri) 
{ 
    if(!uri.IsAbsoluteUri) 
    uri = new Uri(Request.Url, uri); 
    Response.StatusCode = 303; 
    Response.AddHeader("Location", uri.AbsoluteUri); 
    Response.ContentType = "text/uri-list"; 
    Response.Write(uri.AbsoluteUri); 
    Context.ApplicationInstance.CompleteRequest(); 
} 
private void SeeOther(string relUri) 
{ 
    SeeOther(new Uri(Request.Url, relUri)); 
} 
+0

ありがとうございます。 303にリダイレクトしようとしましたが(上記のサンプルコードでは他のものと同様に)、Internet ExplorerはSilverlightコントロールの要求に関係なく404を返すようにしています。 :((遅い返事のためにお詫び申し上げます) –

関連する問題