3

Silverlight 3 を使用してサーバーから画像を返そうとしています。サーバーは次のような応答ストリームを返します。

 context.Response.ContentType = imageFactory.ContentType
 imgStream.WriteTo(context.Response.OutputStream)
 imgStream.Close()
 context.Response.End()

Silverlight クライアントでは、次のようにストリームを処理しています。

    Dim request As HttpWebRequest = result.AsyncState
    Dim response As HttpWebResponse = request.EndGetResponse(result)
    Dim responseStream As IO.Stream = response.GetResponseStream()

そのストリームを取得してブラウザの保存ダイアログを開きたいのですが、私が調べたオプションの1つは Html.Window.Navigate(New Uri("image url")) を使用することで、これにより正しいブラウザのデフォルトダイアログが開きましたが、オプションではありませんHttpRequest.Headers.Item を介して拡張情報 (XML など) をサーバーに送信する必要があり、Navigate はこれを許可しないためです。

Html.Window.Navigate(New Uri("image url")) を使用せずに、Silverlight アプリケーションから応答ストリームを取得し、既定のブラウザーの [保存] ダイアログを強制的に表示するにはどうすればよいですか?

4

1 に答える 1

2

率直な答えは、できないということです。Silverlight SaveFileDialog は、ボタン クリックなどのユーザー操作の直接的な結果としてのみ開くことができます。

この種の問題 (アップロードが必要な場合) の解決策は、XML をサーバーに投稿して、セッション オブジェクトまたはファイルとして保存することです。応答は、GUID などの XML を取得するために使用できるハンドルです。

次に、URL のクエリ文字列に GUID を配置する標準のナビゲーションを使用できます。受信スクリプト (この場合は ashx) は、URL で提供されたハンドルを使用して、以前にポストされた XML を取得できます。

サーバー側の応答を次のようにコーディングすることもできます。

context.Response.ContentType = imageFactory.ContentType;
context.Response.AddHeader("Content-Disposition", "attachment;file=someimage.jpg"); 
imgStream.WriteTo(context.Response.OutputStream);
imgStream.Close();

これにより、ブラウザに「開くまたは保存するダイアログ」が表示されます。通常、現在のウィンドウのナビゲーション状態は維持されるため、SL アプリは現在の状態のままである必要がありますが、実際にはテストしていません。

ところで、Response.End() がないことに注意してください。これはひどいことです。回避できる場合はそうしてください。

于 2010-03-25T11:24:04.107 に答える