3

.NET 4.5.1、Web API 2、Visual Studio 2013 を使用:

次のルートを持つWeb APIがあります...

  • /api/プロバイダー/専門
  • /api/providers/specialties/123
  • /api/providers/specialties/medicine

これらは期待どおりに機能します...最初のものはすべての専門分野のリストを取得し、2 つ目は専門分野 ID 123 を取得し、3 つ目は名前に「medicine」を含むすべての専門分野を取得します。

私もこれらのルートを持っています...

  • /api/locations/名物
  • /api/locations/specialties/123
  • /api/locations/specialties/ortho

最後の 2 つだけが機能します...最初の 1 つはこのエラーを返します:

No HTTP resource was found that matches the request URI [...]
No route providing a controller name was found to match request URI 'http://mysite/api/locations/specialties'

どうすればいいの?ベースルートだけでなく、そのコントローラーの他のルートにもヒットします。

(他に/api/providers/api/locationsのルートを持つ 2 つのコントローラーがありますが、これらは正常に動作します。)

ProviderSpecialtyController.csコードは次のとおりです。

[RoutePrefix("api/providers/specialties")]
public class ProviderSpecialtyController : ApiController
{
    private ProviderEntities db = new ProviderEntities();

    /// <summary>
    /// Get ALL specialties, sorted by name.
    /// </summary>
    [Route("")]
    public IQueryable<ProviderSpecialty> Get()
    {
        return db.ProviderSpecialties.OrderBy(s => s.Name);
    }

    /// <summary>
    /// Get a specific specialty.
    /// </summary>
    /// <param name="id">The ID of a particular specialty.</param>
    [Route("{id:int}")]
    public ProviderSpecialty Get(int id)
    {
        return db.ProviderSpecialties.Where(s => s.Id == id).FirstOrDefault();
    }

    /// <summary>
    /// Get all specialties that contain a keyword.
    /// </summary>
    /// <param name="keyword">The keyword to search for in a specialty name.</param>
    [Route("{keyword:alpha}")]
    public IQueryable<ProviderSpecialty> Get(string keyword)
    {
        return db.ProviderSpecialties.Where(s => s.Name.Contains(keyword)).OrderBy(s => s.Name);
    }
}

LocationSpecialtyController.csコードは次のとおりです。

[RoutePrefix("api/locations/specialties")]
public class LocationSpecialtyController : ApiController
{
    private ProviderEntities db = new ProviderEntities();

    /// <summary>
    /// Get ALL specialties, sorted by name.
    /// </summary>
    [Route("")]
    public IQueryable<LocationSpecialty> Get()
    {
        return db.LocationSpecialties.OrderBy(s => s.Name);
    }

    /// <summary>
    /// Get a specific specialty.
    /// </summary>
    /// <param name="id">The ID of a particular specialty.</param>
    [Route("{id:int}")]
    public LocationSpecialty Get(int id)
    {
        return db.LocationSpecialties.Where(s => s.Id == id).FirstOrDefault();
    }

    /// <summary>
    /// Get all specialties that contain a keyword.
    /// </summary>
    /// <param name="keyword">The keyword to search for in a specialty name.</param>
    [Route("{keyword:alpha}")]
    public IQueryable<LocationSpecialty> Get(string keyword)
    {
        return db.LocationSpecialties.Where(s => s.Name.Contains(keyword)).OrderBy(s => s.Name);
    }
}

ご覧のとおり、ルート プレフィックスを除いてほぼ同じです。プロバイダー コントローラーは期待どおりに動作するのに、ロケーション コントローラーは動作しないのはなぜですか?

トレースを有効にしましたが、 /api/locations/specialtiesをヒットしようとすると、次のことが観察されます。

System.Web.Http.Request: GET http://localhost:49565/api/locations/specialties/: Category=System.Web.Http.Request, Level=Info Begin   http://localhost:49565/api/locations/specialties/
System.Web.Http.Controllers: GET http://localhost:49565/api/locations/specialties/: Category=System.Web.Http.Controllers, Level=Info Begin DefaultHttpControllerSelector SelectController Route='MS_SubRoutes:System.Web.Http.Routing.IHttpRouteData[]'
[...]
System.Web.Http.Controllers: GET http://localhost:49565/api/locations/specialties/: Category=System.Web.Http.Controllers, Level=Error End DefaultHttpControllerSelector SelectController Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.
4

1 に答える 1

1

これは思ったより簡単でしたが、デバッグが不十分であるためにさらに困難になった理由の特定が困難になりました (これは、 Kiran Challaによって Codeplexのバグとして報告され、検証されましたこれは、Web API 2.1 の時点で修正される必要があります。

このルートのコントローラーがありました:

/api/locations/keyword

でキーワード検索を行いkeywordます。

これらのルートを持つ別のコントローラーがありました:

/api/locations/specialties
/api/locations/specialties/123
/api/locations/specialties/keyword

基本的に同じルートを持つ 2 つのコントローラーがあったため、API エンジンは混乱していました。1つ削除したところ、問題は修正されました。

Codeplex イシュー トラッカーによると、問題は検証され、クローズされ、新しいエラー メッセージがWeb API 2.1に追加されました。

于 2014-05-06T17:37:44.290 に答える