2012-01-01 10 views
3

私はいくつかの奇妙な問題で遭遇しました。私はそれを理解していないので、すべてが正常に動作する前に私にとっては奇妙です。だから、私の仕事は、コントローラを呼び出してファイル名(拡張子付き)を渡すことです。コントローラーはこのファイルを認識し、ログに書き込んだり、ファイルがあれば(ダウンロードフォルダに)戻します。私は何をやっている:ASP.NET MVC 3:idがファイル名のときにファイルの代わりにコントローラを探す方法

public class DownloadController : Controller 
{ 
    public ActionResult Files(string id) 
    { 
     string filePath = Server.MapPath(Url.Content(string.Format("~/Downloads/{0}", id))); 
     string serverPath = Url.Content(string.Format("~/Downloads/{0}", id)); 
     string ext = Path.GetExtension(filePath); 
     if (!System.IO.File.Exists(filePath)) 
     { 
      //return to the error controller 
     } 
     string mem = "text/html"; 
     if (ext == ".zip") 
     { 
      mem = "application/x-zip-compressed"; 
     } 
     else if (ext == ".html" || ext == ".htm") 
     { 
      mem = "text/html"; 
     } 
     else if (ext == ".pdf") 
     { 
      mem = "application/pdf"; 
     } 
     //Save info about downloads into DB 
     repStat.SaveStatInfo(id, HttpContext.Request.UserHostAddress, 
     HttpContext.Request.UserHostName, HttpContext.Request.UserAgent); 
     return File(serverPath, mem, id); 
    } 
} 

ことのGlobal.asaxの部分があります:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.IgnoreRoute("Content/{*pathInfo}"); 

それはより多くの "無視" を持っていません。

したがって、問題は私が電話をしているときです:mysite.com/download/files/test.pdfサーバーは私に「ページが見つかりません」と返します。もちろん、ダウンロード/ファイルパスにそのようなファイルはありません!コントローラーを呼び出す必要がありますが、実際のファイルは呼び出さないでください。 mysite.com/download/files/testのような拡張機能を削除すると、サーバはコントローラを呼び出します。私はなぜパラメータとしてファイル名を認識しないのかわかりませんし、ファイルを見つけようとします。

他のコントローラを使用しようとすると、まったく同じ動作が起こります。パラメータに拡張子がないとすぐに、サーバはファイルを探します。

最も奇妙なことは、すべてがローカルでうまく動作しますが、サーバーでは機能しません(ツールは長くは動作しませんでしたが、停止しました)。

答えて

1

私にも奇妙に見えます。この問題を回避するには、ドットを符号化することであろう(。)のような、例えば、次に

test.pdf -> test++pdf 

と、それをバックデコードし、それを復号化します。

おそらく最良の解決策ではありませんが、確かに問題を解決します。

+0

お返事ありがとうございます。実際には、mysite.com/downloads/test.txtのようなパスを指定するだけで問題を解決できます。この場合、このファイルが見つかります。奇妙なのはなぜこの場合asp.net mvcが実際のファイルではなくコントローラを探すべきか理解していないような理由です。私はおそらく、サーバー側が不適切に構成されていると思う、asp.netと間違って何かを開始します。 – mimic

+0

私は情報を追加したいと思います。 X-AspNet-Version:4.0.30319 X-AspNetMvc-バージョン:3.0 X-AspNetバージョンは、 Powered By:ASP.NET "ただし、拡張子を追加すると「サーバー:Microsoft-IIS/6.0 X-Powered-By:ASP.NET」 – mimic

+0

ファイルを直接指定すると、ファイルが存在し、例えば、類似するファイルを検索する代替ページを返すなど、何でもよい。とにかく、それがあなたの目的を果たすならば、クール!新しく追加された情報は、リクエストを確認するだけで、それとは異なる理解ができます。たぶんドットのせいで、IIS6はファイルを探すだけで、コントロールを必要とすることさえ考慮しません。わからない... –

関連する問題