4

セッション値に基づいてサイトからファイルをダウンロードできるようにするために、HttpHandlerを実装します。セッションが存在する場合は、ユーザーがファイルをダウンロードできるようにします。それ以外の場合は、サイトのログインページであるインデックスページにリダイレクトします。iisサーバーでWebサイトを実行すると、iis Expressでコードが完全に機能し、ハンドラーが機能しません。

IIS Expressの場合、web.configファイルには、私が追加した次のセクションがあります。以下の構成は、iisExpressで機能しています。

<system.web>

<httpHandlers>

  <add verb="*" path="*.pdf" type="QDMS.FileHandler" />
Same add tag for all the files to restrict downloading without session.

</httpHandlers>

</system.web>

動作していないIISサーバーの構成は次のとおりです。

<system.webServer>

<handlers>
  <add name="Files" path="*.pdf,*.doc,*.docx,*.rar,*.zip,*.ppt,*.pptx,*.jpg,*.png,*.bmp,*.gif,*.html,*.htm,*.pps" verb="*" type="QDMS.FileHandler" resourceType="Unspecified" requireAccess="script" />    
</handlers>

</system.webServer>

私のファイルハンドラーは以下のとおりです

using System;
using System.Web;
using System.Web.SessionState;
using QDMS.Old_App_Code;

namespace QDMS
{
public class FileHandler : IHttpHandler, IReadOnlySessionState
{
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
if (!CheckWetherTheRequestForFileExistOrNot(context)) return;
if (CheckUsersForFileDownloading(context))
context.Response.Redirect("~/index.aspx");
else
{
var rawURL = context.Request.RawUrl;
var dotIndex = rawURL.LastIndexOf(".", System.StringComparison.Ordinal);
var ext = rawURL.Substring(dotIndex);
context.Response.ClearContent();
context.Response.ClearHeaders();
context.Response.ContentType = MIMEEType.Get(ext);
context.Response.AddHeader("Content-Disposition", "attachment");
context.Response.WriteFile(rawURL);
context.Response.Flush();
}  
}
public bool CheckWetherTheRequestForFileExistOrNot(HttpContext context)
{
string url = context.Request.RawUrl.ToLower().Trim();
if (url.Contains(".pdf") || url.Contains(".xls") || url.Contains(".xlsx") || url.Contains(".jpg") ||
            url.Contains(".bmp") || url.Contains(".rar") || url.Contains(".doc") || url.Contains(".docx") ||
            url.Contains(".png") || url.Contains(".gif") || url.Contains(".pptx") || url.Contains(".zip") ||
            url.Contains(".ppt") || url.Contains(".pps") || url.Contains(".htm") || url.Contains(".html"))
return true;
else
return false;
}
public bool CheckUsersForFileDownloading(HttpContext context)
{
return (context.Session["FrontHiddenID"] == null) && (context.Session["HiddenID"] == null);
}
}
}

web.configファイルのセクションが正しくないため、機能していないと確信しています。したがって、web.configファイルのハンドラーセクションを修正するための提案が必要です。この問題に関するアドバイスやヘルプは大歓迎です

4

2 に答える 2

3

IISハンドラーは次のようになります。

<add name="Files" path="*.pdf" verb="*" type="QDMS.FileHandler" resourceType="Unspecified" requireAccess="Script" />

お使いのバージョンとの2つの違い:

  • ファイルマスクは1つだけで、ファイルタイプごとにハンドラーを登録する必要があります
  • requireAccess="Script"'Script'は大文字の'S'を持ちます

これがお役に立てば幸いです

于 2013-02-06T15:19:03.637 に答える
3

クラシックモードで実行されているIIS7.0でファイル名拡張子をマップするには

  1. IISマネージャーを開きます。
  2. Webサーバーコンピューターのノードを展開し、[サイト]を展開してから、[既定のWebサイト]を展開します。
  3. アプリケーションのノードを選択します。機能ビューペインが表示されます。
  4. 機能ビューで、[ハンドラーマッピング]をダブルクリックします。
  5. [操作]ウィンドウで、[スクリプトマップの追加]をクリックします。[スクリプトマップの追加]ダイアログボックスが表示されます。
  6. [スクリプトマップの追加]ダイアログボックスで、次のように指定します。oリクエストパス。マップする名前またはファイル名拡張子。o実行可能。要求を処理する.exeまたは.dllファイルのパス。クラシックモードの場合は、ASP.NET ISAPI拡張機能(Aspnet_isapi.dll)を指定します。o名前。わかりやすい名前。
  7. [OK]をクリックして、[スクリプトマップの追加]ダイアログボックスを閉じます。
  8. アプリケーションのWeb.configファイルを開きます。
  9. system.webセクションのhttpHandlers要素を見つけて、ファイル名拡張子のエントリを追加します。

統合モードで実行されているIIS7.0でファイル名拡張子をマップするには

  1. 前の手順のステップ1から3に従います。
  2. [操作]ウィンドウで、[管理対象ハンドラーの追加]をクリックします。[管理対象ハンドラーの追加]ダイアログボックスが表示されます。
  3. [管理対象ハンドラーの追加]ダイアログボックスで、次のように指定します。o要求パス。マップするファイル名またはファイル名拡張子。oタイプ。管理対象ハンドラーのタイプ(クラス)名。ハンドラーがASP.NETアプリケーションのApp_Codeフォルダーで定義されている場合、そのタイプ名がドロップダウンリストに表示されます。o名前。わかりやすい名前。
  4. [OK]をクリックして、[管理対象ハンドラーの追加]ダイアログボックスを閉じます。
于 2014-05-13T07:42:53.567 に答える