2012-01-09 27 views
3

MVC Webアプリケーションは、任意の文字(%、+、/など)を含むことができるアクティベーションリンクを生成します。私は、文字列をエンコードし、リンクを生成URL:URLエンコードされたASP.NET MVCで処理されるパラメータ

new UrlHelper(HttpContext.Current.Request.RequestContext) 
     .RouteUrl("AccountActivation", 
       new { id = HttpContext.Current.Server.UrlEncode(activationString) }; 

は、ドメインを追加し、同じように見えます:URLは、ユーザーに渡され

http://localhost/AccountActivation/asdlkj223%25asd%2Basw3fgasdme 

。それは私には罰金に見える

routes.MapRoute(
      "ActivateAccount", 
      "AccountActivation/{id}", 
      new { controller = "Account", action = "Activate", id = ""});  

が、ASP.NET開発サーバーと私にHTTPエラー400与えるIIS - 不正要求を:

この場合のルートがあります。つまり、私には見えないURLに問題があります。

ルートの説明に{ID}を取り除く

(私もノー成功と{* ID}を試してみました):

routes.MapRoute(
      "ActivateAccount", 
      "AccountActivation", 
      new { controller = "Account", action = "Activate"}); 

URLは次のようになります。

http://AccountActivation?id=asdlkj223%25asd%2Basw3fgasdme 

と彼らちょうどいい仕事...

私はこれらの2つのアプローチはまったく同じことをしますが。それらの違いは何ですか?私のために何かを実行するMVCエンジンか、URLエンコーディングで何かが恋しいですか?

+0

アクティベートアクションはどのように見えますか?根本的なエラーに関する詳細情報をログに記録する例外はありますか? – chris

答えて

4

UrlEncodeの代わりにUrlPathEncodeを試してください。いくつかの文字は、クエリ文字列で合法なパスでは不正です。

これは言いました。私は文字が「悪い」かどうかの分析はパスデコードが行われた後に実行されると信じています。 IISによって実行されます。 URLが物理ファイルシステムにマップする可能性があるため、にアクセスできないようにすることができるため、一部の文字は拒否されます。同様に、送信されるべきではないデータを要求から送信するのを防ぐために行われます。

一般的に、パラメータがルートパラメータとしてマップされていることによる操作上のメリットがない場合は、マップするのが難しくありません。特にこの場合は文字列が何でもよい場合があります。

ところで - これがバイナリデータのエンコーディングであれば、代わりにそれを16進数でエンコーディングするか、modified base-64 for URLsを使用することができます。ルートパラメータとしてマップされている場合はエラーは発生しません。

関連する問題