他の質問を確認しましたが、いくつかの点について明確にしたいと思います。(ここに盲目的に明らかなことがあれば、ご容赦ください。侮辱するつもりはありません。同じページにいることを確認したいだけです。)
まず、client と server。サーバー側のものはすべて、ユーザー アカウントのコンテキストで実行され、それが実行されるマシンに対して相対的です。サーバー側のコードを使用して「これをデスクトップに保存する」と言った場合、これはサーバーのローカル プロセスのデスクトップであり、ほとんど意味がありません。ただし、ログインしているユーザーを偽装している場合は、サーバー上のログインしているユーザーのデスクトップに保存する場合を除いて、これは機能する可能性があります。クライアントとサーバーが同じマシンで実行されていて、クライアントを偽装している場合、これは実際には完全に機能する可能性があります。多分。
次に、右クリックして [名前を付けて保存] を選択します。リンクを右クリックすると、ブラウザに組み込まれた独自のメニュー システムが呼び出されます。そのシステムはブラウザおよび/またはOS固有であり、仕様では定義されていません。90 年代には、VBScript を使用して "キーを送信" し、Internet Explorer にそのリンクを "クリック" させることができたかもしれませんが、その時代は過ぎ去りました。これに最も近い現代の同等物は、あなたがしたくないと私が想像するプラグインを書くことです(そして、ブラウザおよび/またはOS固有のものになるでしょう)。
3 つ目は、MIME タイプです。一般的に言えば、すべての HTTP 応答には、送信されるバイトに対するサーバーの意図を指定する MIME タイプが含まれています。これらには、 や などがtext/html
ありapplication/pdf
ます。サーバー側コード (ASP.Net) が呼び出されない場合、たとえば、画像や CSS などの静的ファイル、または PDF などの事前生成されたファイルでさえ、サーバー (IIS) はリスト内のファイル拡張子を調べて、何が何であるかを判断します。送信する MIME タイプ。クライアント側では、ブラウザーは MIME タイプを使用して、実行するアクションを決定します。そうであればtext/html
、(おそらく) HTML をレンダリングします。そうであるapplication/pdf
場合、ブラウザはそのMIME タイプのリストを表示して、その MIME タイプが登録されているアプリケーションがあるかどうかを確認します。最近のほとんどのブラウザーには PDF レンダラーが組み込まれているため、ブラウザーはバイトをそれに渡してレンダリングします。ブラウザーがその MIME を認識していない場合、OS に認識しているかどうか、登録済みのハンドラーが利用可能かどうかを確認し、存在する場合はそれを通過させます。それがすべて失敗した場合 (おそらく私のようなユーザーがその特定の MIME タイプを無効にしたため)、ブラウザーはそれらのバイトを「ダウンロード」フォルダーに入れるか、それらのバイトをテキストとして解釈しようとするか、保存するように求めます。
HTTP 仕様(19.5.1 パラグラフ 3) に従ってapplication/octet-stream
、この最後のものをもう少し詳しく説明しContent-Disposition: attachment; filename="fname.ext"
ます。
暗黙の提案は、ユーザー エージェントが応答を表示するのではなく、「応答を名前を付けて保存...」ダイアログに直接入る必要があるということです。
これがあなたが最終的に達成しようとしていることですよね?
あなたの場合、PDF リンクをクリックすると ASP.Net がバイパスされ、IIS はファイルを検索してapplication/pdf
MIME タイプを送信します。解決策の 1 つは、 PDF ファイル拡張子をシステムから登録解除することです。ただし、これはおそらく最も移植性の高いソリューションではありません。同様に、ファイル拡張子を に変更するとapplication/octet-stream
、[名前を付けて保存] ダイアログが表示される場合があります。
名前を付けて保存ダイアログを強制するための最良のオプションは、MIME タイプと Content Disposition ヘッダーを強制的にストリームに入れ、ファイルの未加工バイトを渡す何らかの種類のサーバー側のハンドラーを作成することです。これはいくつかの方法で行うことができます。おそらく、 (おそらくここでIHttpHandler
はさらに良いでしょう) を使用するか、クエリ文字列を検査する 1 つの ASPX ページだけを使用します。追加のセキュリティを実行し、ファイル名にパスのような文字やコマンドを許可しないようにする必要があります。