2016-03-19 3 views
0

を使用します。Config.Routes.MapHttpRoute()で動作するデフォルトルートを取得できない場合がありますが、コントローラにルート属性としてルートを入力すると正常に動作します。WebAPI MapHttpRouteは動作しませんが、AttributeRoutingは

Global.asaxの

protected void Application_Start() { 
    AreaRegistration.RegisterAllAreas(); 
    WebApiConfig.Register(GlobalConfiguration.Configuration); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    //RouteConfig.RegisterRoutes(RouteTable.Routes); 
    //BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

(彼らは私がそれらを残していても非WebAPIの要件(右?)と同じ結果だとして最後の2を削除)

WebApiConfig.cs

public static void Register(HttpConfiguration config) { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "v1/{controller}/{action}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 

コントローラ

public class ErrorsController : ApiController 
{ 

    [HttpGet] 
    [Route("v1/Errors/Get")] 
    public IHttpActionResult Get(int id) { 
     return Ok(); 
    } 

    [HttpPost] 
    [Route("v1/Errors/Submit")] 
    public IHttpActionResult Submit() 
    { 
     // do stuff 
     return Ok(); 
    } 
} 

属性のルートがある場合はすべて正常です。私がしなければ、私は404を得る。たとえば、次の2つのレポート404エラー:

localhost:myport/v1/Errors/Get?id=5

localhost:myport/v1/Errors/Submit

しかし、私はこの提出する場合:

localhost:myport/v1/Errors

を、私は、次の応答を取得

No HTTP resource was found that matches the request URI ' http://localhost:59498/v1/Errors/ '.

No type was found that matches the controller named 'v1'.

明らかに私のルート構成は蹴られていませんが、私の人生のために私はなぜそれを伝えることはできません。私も多分Defaultは、いくつかの内部的意義を持っていたことを考えて、Default代わりのDefaultApiにルート名を変更してみました。

答えて

1

「ノーマル」ルーティングは、その中に接頭辞「V1」とのルートのこの種類をサポートしていません。別のやり方では、この種の切り抜きは古いMVCルーティングに従います。アドレスの最初の部分はコントローラでなければなりません。あなたがアドレスlocalhost:myport/v1/Errorsを設定するときにシステムは、現在、「V1」という名前のコントローラを探しています。

あなたは、属性が、ルーティングに固執する必要が前に接頭辞でルートを使用する場合は、それが属性を使って完全に動作する理由であり、それがなければならないわけではありません。

私はあなたがV1の事のために、「グローバル」の接頭辞を使用することをお勧めできますか?これにより、異なるリソースでURLの同じ部分を何度も何度も繰り返すことを避けることができます。実装の詳細については、thisの記事をチェックすることをおすすめします。

+0

ヘクタールああ...それは理にかなっています。しかし、これを確認するには、非Web APIルーティングの特殊なルートでも問題ありませんか? (私は、通常のMVCでは非デフォルトルートとして接頭辞付きの同様の構文を使用してきました)。いずれにしても、答えをありがとう - 今私は理由を知っています(そして役に立つリンクもあります)。 – jleach

関連する問題