2017-02-26 40 views
1

こんにちは、私はweb api2とangularjsで1つのアプリケーションを開発しています。私はangularjsからURLにアクセスする際にいくつかのルーティング問題があります。Web apiで動作しないメソッドを取得する

私は以下のURLにアクセスしようとしています。

var url = '/api/projects/4/processes'; 

私のコントローラコードは以下のようになります。

[RoutePrefix("api/processes")] 
public class processesController : ApiController 
{  
    [ActionName("projects/{projectsId}/processes")] 
    public HttpResponseMessage Get(int id) 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, ""); 
    } 
} 

404エラーが発生します。私はURLを打つことができません。

これは私のwebapi.configファイルです。

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

助けてください。

答えて

3

まずその属性ルーティングが慣例に基づくルートの前に有効になっていることを確認。

config.MapHttpAttributeRoutes(); 

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

目的のURLが/api/projects/4/processesの場合は、指定されたアクションが一致するようにルートテンプレートを更新する必要があります。コントローラは、既にルートの接頭辞を持っているが、それはルートの接頭辞を上書きする方法属性にチルダ(〜)を使用しチルダ~

でルートテンプレートを付けることによって上書きすることができます。

//GET /api/projects/4/processes 
[HttpGet]  
[Route("~/api/projects/{projectsId:int}/processes")] 
public HttpResponseMessage Get(int projectsId) { ... } 

出典: Attribute Routing in ASP.NET Web API 2

+0

ルート引数名は一致しませんか? 'Get(int projectsId)' – Developer

+0

@Developerが正しいです。私の部分にタイプミス – Nkosi

+0

ありがとう。私は試していると私は404エラーを取得しています。 –

1

あなたは、アクションのURLを意味し、ルートプレフィックス、

すなわちHTTP GET API /プロセス/プロジェクト/ {projectsId} RoutePrefix + ActionRouteだろう/で

参考docs

1

を処理していあなたの場合、URLは、また、

http://yourUrl/api/processes?projectsId=yourValue

なるルートAにごACTIONNAMEを変更する必要がありますttribute、

[RoutePrefix("api/processes")] 
public class ProcessesController : ApiController 
{ 
    [Route("projects/{projectsId}/processes"),HttpGet] 
    public HttpResponseMessage Get(int projectsId) 
    { 
     return Request.CreateResponse(HttpStatusCode.OK, ""); 
    } 
} 

新しいURL - http://yourUrl/api/processes/projects/2/processes

More info on Attribute routing

+1

ありがとう:

config.MapHttpAttributeRoutes(); 

その後、次のようなメソッドが定義

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

をルーティングすることができます。これも機能します... –

1

慣習に基づくルートの前に属性のルーティングを有効にする必要があります。

//GET /api/projects/4/processes ([ActionName("projects/{projectsId}/processes")]) 
[RoutePrefix("api/processes")] 
public class processesController : ApiController 
{ 
    [HttpGet]  
    [Route("~/api/projects/{projectId:int}/processes")] 
    public HttpResponseMessage Get(int projectId) { ... } 
} 
関連する問題