IIS 7共有ホスティング環境にWebサイトがあります。NET3.5を実行しています。サーバーからファイルをダウンロードするためのダウンロードボタンがあります。
このアプリケーションをローカルにIIS 6にデプロイすると、正常に動作します。IIS 7共有ホスティングサーバーで、例外が発生します。
ハンドルが無効です。 (HRESULTからの例外:0x80070006(E_HANDLE))説明:現在のWeb要求の実行中に未処理の例外が発生しました。エラーの詳細およびコードのどこで発生したかについては、スタックトレースを確認してください。
System.Runtime.InteropServices.COMException:ハンドルが無効です。 (HRESULTからの例外:0x80070006(E_HANDLE))
COMException(0x80070006):ハンドルが無効です。 (HRESULTからの例外:0x80070006(E_HANDLE))] [HttpException(0x80004005):リモートホストとの通信中にエラーが発生しました。エラーコードは0x80070006です。]
これはどのように解決できますか?
string strRequest = Convert.ToString(Request.QueryString.Get("file"));
System.IO.FileInfo file = new System.IO.FileInfo(strRequest);
if (file.Exists)
{
Response.Clear();
Response.ContentType = ReturnExtension(System.IO.Path.GetExtension(file.Name));
Response.AppendHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.TransmitFile(strRequest);
Response.End();
HttpContext.Current.ApplicationInstance.CompleteRequest();
//DownloadFile(file.FullName, file.Name);
}
.batファイルを作成し、次のコマンドを入力してファイルを実行します。既存のすべてのWebサーバープロセスを強制終了し、問題を修正する必要があります。私は同じ問題を抱えていましたが、うまくいきました。どうもありがとう
taskkill /fi "imagename eq webdev.webserver40.exe"
以下のリンクから修正を見つけました:
if (file.Name == fileName)
{
Response.ClearContent();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.TransmitFile(file.FullName);
//Response.End(); Will raise that error. this works well locally but not with IIS
Response.Flush();//Won't get error with Flush() so use this Instead of End()
}
私たちの環境でこの問題を解決しました。偽装を有効にし、アプリケーションプールをApplicationPoolIdentityとして実行しています。
問題は、偽装されたユーザーがファイルにアクセスできたとしても、アプリプールIDにソースファイルへの読み取りアクセス権がないために発生しました。この解決が難しいのは、ユーザーとアプリプールの両方にアクセス権がない場合、アクセス許可エラーが発生することです。
私の場合、このファイルへの書き込みと読み取りを試みました。
var path = System.IO.Path.GetTempFileName();
以下のコードを使用しましたが、うまくいきました。 IISユーザーは一時ファイルへの書き込みまたは一時ファイルからの読み取り権限がありませんでした。
var path = Server.MapPath(@"~\App_Data\Stats");
Directory.CreateDirectory(path);
path = Path.Combine(path, String.Format("{0}.csv", Guid.NewGuid()));
using (var streamWriter = new StreamWriter(path))
using (var csvWriter = new CsvHelper.CsvWriter(streamWriter))
{
csvWriter.Configuration.Delimiter = csvWriter.Configuration.CultureInfo.TextInfo.ListSeparator;
csvWriter.WriteRecords(rounds);
}
return File(path, "text/csv", "Stats.csv");
編集:ページの読み込みに関する部分を最初は見逃していた。クエリ文字列から何が渡されるのか正確にはわかりませんが、Server.MapPathを使用してみましたか?代わりに
System.IO.FileInfo file = new System.IO.FileInfo(strRequest);
あなたが持っている
System.IO.FileInfo file = new System.IO.FileInfo(Server.MapPath(strRequest));
それが役立つかどうか教えてください。
私の場合、これは特定のユーザーログインに対してのみ発生しました。他のすべてのユーザーが機能していました。
問題はユーザーのLoginEmailの余分な空白でした。
これは、ホスティングサーバー上にあるディレクトリからExcelファイルをダウンロードするためにAsp.net IdentityおよびImpersonationを使用していたMVCアプリケーションで発生しました。
奇妙なもの!