2017-06-28 14 views
0

このエラーに関して、ここでStackoverflowと他の場所で見つかったすべてのソリューションを試しましたが、まだ問題が発生しています。Web API:ルートコレクションで「X」という名前のルートを見つけることができませんでした。

私たちには、POSTメソッドを持つ.NET APIがあり、それはCreatedAtRouteレスポンス(201)を返します。問題は、CreatedAtRouteレスポンスを返すときに、「Xという名前のルートがルートコレクション内に見つかりませんでした」というエラーが表示されます.Xはルートの名前です。

Global.asaxの

protected void Application_Start() 
{ 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    GlobalConfiguration.Configuration.UseStructureMap<MasterRegistry>(); 

    var allDirectRoutes = WebApiConfig.GlobalObservableDirectRouteProvider.DirectRoutes; 
} 

WebApi.config - 私たちは、デフォルトルートの前に宣言MapHttpAttributesを持っています。

public static class WebApiConfig 
{ 
    public static ObservableDirectRouteProvider GlobalObservableDirectRouteProvider = new ObservableDirectRouteProvider(); 

    public static void Register(HttpConfiguration config) 
    { 
     config.Formatters.Clear(); 
     config.Formatters.Add(new JsonMediaTypeFormatter()); 

     // Web API routes 

     config.MapHttpAttributeRoutes(GlobalObservableDirectRouteProvider); 

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

コントローラ - GetCompoundByIdルート これは我々が名前のルート

[HttpGet] 
[Route("{id:Guid}", Name = "GetCompoundById")] 
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(CompoundViewModel))] 
public async Task<IHttpActionResult> Get(Guid id) 
{ 
    var serviceResult = await Task.FromResult(CompoundService.Get(id)); 

    if (serviceResult == null) 
    { 
     return NotFound(); 
    } 

    CompoundViewModel result = 
      new CompoundViewModel {Id = serviceResult.Id, Name = serviceResult.Name}; 

    return Ok(result); 
} 

コントローラ使用して構築するルートである - という名前のため、エラーがスローされた場所ですPOSTアクション に戻るCreatedAtRouteをルートが見つかりません。

return CreatedAtRoute("GetCompoundById", new {id = result.Id}, result); 

注:WebApi.configでは私が私が起動時に作成したルートを確認することができますし、私は私の名前のルートがコレクション内に存在を確認できObservableDirectRouteProviderを作成しました。 enter image description here

+0

'public async Task Get(Guid id)'メソッドの全内容を含めてください。 – mjwills

+0

完全なGet(id)メソッドコードを追加しました –

+0

@ Mr.Bellisルートが無効なルート制約を使用しています。 '[ルート( "{ID:GUID}"、NAME = "GetCompoundById")] – Nkosi

答えて

0

を使用して問題が妙に私たちが名前のルートを使用して、または(他のすべての記事は、私はそれを修正する助けにはならなかった理由を説明する)WebAPIのルーティングを設定された方法と直接は何の関係もなかったです。この問題は、IoCコンテナとしてStructureMapをどのように使用していたかの副作用であることがわかりました。私たちは、エラーの原因の奇妙な副作用を持っていた

scanner.SingleImplementationsOfInterface(); 

を呼んでいたのStructureMapレジストリで

。非常に長くて面倒な消去プロセスを実行することで、この正確な行まで追跡しました。ルーティングを削除したら、再び期待どおりに動作しました。私は、これによって、WebApiの依存関係の一部が、間違った種類のメモリをルーティングテーブルを解決できないメモリにロードすることしか想定できません。

0

コントローラでルートプレフィックスを使用している場合、すべてのアクションのルート名を定義する必要があります。この

[HttpGet] 
[Route(Name = "GetCompounds")] 
[SwaggerResponse(HttpStatusCode.OK, Type = typeof(IEnumerable<ApiModels.CompoundViewModel>))] 
public async Task<IHttpActionResult> Get(int page = 0,int pageSize = CoreModels.Pagination.DefaultPageSize) 
+0

これは問題を解決していない、私たちはすでに名前付きルートを使用している、問題は、 "CreatedAtRoute"応答を使用すると、 。 –

関連する問題