2017-03-09 17 views
0

私はこの一日中苦労しています。私はiveがこれに見られるすべての答えの終わりに達したと思います。たぶん、私は特別な、または多分私は何か愚かなやっている。 私は最近V3からV4にアップグレードした(私は思う)。私はSystem.Web.OData名前空間を使用しています。ここで 属性ルーティング:「有効なODataPathテンプレートではありません」

は私のWebAPIConfig

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http; 
using System.Web.OData.Builder; 
using System.Web.OData.Extensions; 
using System.Web.OData.Routing; 
using System.Web.OData.Routing.Conventions; 

using GizmoAPI.Models; 
namespace GizmoAPI 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      config.Routes.MapHttpRoute(
       name: "DefaultApi", 
       routeTemplate: "api/{controller}/{id}", 
       defaults: new { id = RouteParameter.Optional } 
      ); 

      ODataModelBuilder builder = new ODataConventionModelBuilder(); 
      builder.EntitySet<Counterparty>("Counterparties"); 

      config.Select().Expand().Filter().OrderBy().MaxTop(null).Count(); 
      config.EnableDependencyInjection(); 
      config.MapHttpAttributeRoutes(); 

      config.MapODataServiceRoute("odata", "odata",  builder.GetEdmModel()); 
      config.AddODataQueryFilter(); 
      var cors = new  System.Web.Http.Cors.EnableCorsAttribute("http://localhost:56248", "*", "*"); 
      config.EnableCors(cors); 
     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new    System.Net.Http.Headers.MediaTypeHeaderValue("text/html")); 
      config.EnableSystemDiagnosticsTracing(); 
     } 
    } 
} 

であり、ここで基本的なコントローラです:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using System.Web.Http.ModelBinding; 
using System.Web.OData; 
using System.Web.OData.Routing; 
using GizmoAPI.Models; 

namespace GizmoAPI.Controllers 
{ 
public class CounterpartiesController : ODataController 
{ 
    private GizmoEntities db = new GizmoEntities(); 

    // GET odata/Counterparties 
    [EnableQuery] 
    public IQueryable<Counterparty> GetCounterparties() 
    { 
     return db.Counterparties; 
    } 

    // GET odata/Counterparties(5) 
    [EnableQuery] 
    [ODataRoute("{key}")] 
    public SingleResult<Counterparty> GetCounterparty([FromODataUri] int key) 
    { 
     return SingleResult.Create(db.Counterparties.Where(counterparty => counterparty.CounterpartyID == key)); 
    } 

その後で本当にhttp://localhost:60965/odata/Counterparties/101 または http://localhost:60965/odata/101

か何かのようにURLを呼び出そうとイムこの点。私はそれを有効にするために欠けているいくつかの種類の構成があるように感じる。私はエラー "コントローラ 'Counterparties'の 'GetCounterparty'アクションのパステンプレート '{key}'が有効なODataパステンプレートではありません。 '{key}'セグメントのリソースが見つかりません。

答えて

0

odataをタグとして追加したので、これは私の問題の100%修正ではありません。

ODataControllerとApiController(WebAPI2.2)を比較すると、後者に切り替わらない理由が見つかりませんでした。 私はコントローラをAPIControllerを継承するように変更し、odataのすべての参照をWebAPIバージョンに切り替えました。実際、上記のコードは前述のコントローラとODataRouteが単に "Route"になっていることを除いてほぼ同じです。コードは完全にコンパイルされ、はるかに管理しやすいです。私は自分のアクションの戻り値の型がiqueryableならodataフィルターを使うことさえできます。

0

GetCounterParties([FromODataUri] int key) にメソッドの名前を変更し、OdataRoute属性を削除しようとしましたか?

+0

はい。そして、それは動作します。しかし、私がしたいのは、コントローラ内のルートです。私はユーザーが得ることができるように望むビュー(実体)のカップルの異なるバージョンがあります。したがって、api/counterpartiesはバニラバージョンを取得し、api/counterparties/advancedはそのビューの高度なバージョンを取得します。 – brhardwick

関連する問題