2012-03-01 7 views
1

MVC4でUriPathExtensionMappingを使用するにはどうすればよいですか?それは、次によMVC 4のUriPathExtensionMapping

routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}.{extension}" 

     ); 

:私は、フォーマッタでのマッピングは、このようなことを追加しました:

MediaTypeMappings.Add(new UriPathExtensionMapping("json", new MediaTypeHeaderValue("application/json")) 

しかし、私は動詞を追加しない限り、私は、次のような、私のルート上の拡張機能を使用することはできません私の望むメディアタイプを認識しますが、アクションのパラメータとして「拡張子」も期待します。例:

public object Get(string extension) 
    { 
    } 

の代わりにちょうど:

public object Get() 
    { 
    } 

どのように私はこの問題を解決することができますか?

ありがとうございます!

答えて

0

私はこの問題に気づいた場合、私は覚えていないが、私は明示のような拡張子のデフォルト値を指定したので、それは次のようになります。

var rF = routes.MapHttpRoute(
    name: "DefaultApi.v1.format", 
    routeTemplate: "api/1/{controller}/{action}.{format}/{*id}", 
    defaults: new { id = RouteParameter.Optional, format = "json", version = 1 } 
); 

* defaultsで始まる行でformat = "json"注意してください。

idの末尾のパラメータを持つリクエスト、たとえば~/api/1/values/get.json/4のリクエストでは、この機能が動作しないことがあります。

0

この問題は再現できません。

あなたは、UriPathExtensionMappingを使用するには、上記で説明したように、あなたのルートに{controller}。{ext}を指定する必要があります。 {controller}を指定してuriが〜/ home.jsonのように見える場合、コントローラトークンはhome.jsonにマップされます。これはおそらくあなたが望むものではありません。

ただし、アクションに「拡張」パラメータを指定する必要はありません。この問題が引き続き発生した場合は、コントローラー、ルート、およびカスタムフォーマッターで設定された設定を含め、レプロ全体を投稿できますか?ありがとうございました。

+1

拡張子はWebApiで使用します。データがXMLまたはjsonとして返されるかどうかは、Connegに関係なく指定します。拡張子はコントローラーと一致しないはずです...それはちょうど愚かです。 QueryStringMappingを使用すると、私のルートに影響を与えずに "format = json"のようなことをすることができます。なぜなら、 "。"を私のルートに影響を与えずにURLの末尾に追加できませんか? – Tyst

+0

また、「api/{controller}。{extension}/{id}」や「/api/{controller}/{id}.{extension}」のようなものを追加する簡略化されたルートは、特にマッチウェルを形成しません{id}がオプションの場合。 UriPathExtensionMappingはルートに影響しません。それは物事を壊すだけです。ルートは自分の{extension}を使用しませんが、ルートマッチングのどこかで指定されていなければ、connegがオーバーライドされるために何も処理されません。 – Tyst