2015-04-30 21 views
5

Web API 2.2'de bir OData 3 hizmeti yapıyorum.ODataController HTTP döndürüyor256 Kabul Edilemiyor

Hizmet, varlıklarım için meta verileri doğru bir şekilde döndürüyor, ancak gerçek varlıklardan birini sorguladığımda 406 Not Available değerini döndürüyor. Oldukça fazla araştırma yaptım (şu anda birkaç dersi takip ediyorum), ama aslında işe yarayan hiçbir şey bulamadım.

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

namespace MyProject 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      ODataModelBuilder builder = new ODataConventionModelBuilder(); 

      builder.EntitySet<MarvelCharacter>("MarvelCharacters"); 
      config.MapODataServiceRoute(
       routeName: "Marvel", 
       routePrefix: "dude", 
       model: builder.GetEdmModel()); 
     } 
    } 
} 

Ve kontrolör (tam değil, ama fikir olsun): Burada

benim WebApiConfig var

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using System.Web.Http.OData; 
using System.Web.Http.OData.Query; 
using Microsoft.Data.OData; 
using MyProject; 

namespace MyProject.Controllers 
{ 
    public class MarvelCharactersController : ODataController 
    { 
     private static ODataValidationSettings _validationSettings = new ODataValidationSettings(); 

     // GET: odata/MarvelCharacters 
     public IHttpActionResult GetMarvelCharacters(ODataQueryOptions<MarvelCharacter> queryOptions) 
     { 
      // validate the query. 
      try 
      { 
       queryOptions.Validate(_validationSettings); 
      } 
      catch (ODataException ex) 
      { 
       return BadRequest(ex.Message); 
      } 

      var entities = new myEntities(); 
      var marvelCharacters = (from c in entities.MarvelCharacters select c).ToList(); 

      return Ok<IEnumerable<MarvelCharacter>>(marvelCharacters); 
     } 
    } 
} 

cevap

18

oldukça basitti Bu sorunun cevabını çıkıyor ama bulabildiğim herhangi bir belge tarafından iyi bir şekilde ele alınmadı.

WebAPI 2.2'de bir OData 3 uç noktası uygulamaya çalışıyordum. Birkaç farklı öğreticiyi takip ettim, bazıları OData 3 ve bazıları OData 4 için.

Kontrol cihazımda WebApiConfig ve OData 3 (System.Web.Http.OData) 'da OData 4 (System.Web.OData) kullanıyordum. Dışarı çıkıyor, birlikte iyi oynamıyorlar.

Başka birinin benzer bir sorunu olması durumunda cevabı burada yayınlamaya karar verdim.

Az bir değer eklemek için ve her ikisini de karıştırdığımdan beri, WebApiConfig aracımdaki ad alanlarını taklit ederek ve sonra da sürüm denetleyicileri oluşturarak 3 ve 4 sürümleri için destek sağlamaya karar verdim.

WebApiConfig:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web.Http; 
using ODataV3 = System.Web.Http.OData; 
using ODataV4 = System.Web.OData; 

namespace MyProject 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // OData V3 Route 

      ODataV3.Builder.ODataModelBuilder builder3 = new ODataV3.Builder.ODataConventionModelBuilder(); 

      builder3.EntitySet<MarvelCharacter>("MarvelCharactersV3"); 
      // The MapODataRoute function is deprecated in WebAPI 2.2, 
      // but I haven't found an alternative for supporting OData 3. 
      config.Routes.MapODataRoute(
       routeName: "Marvel3", 
       routePrefix: "dude3", 
       model: builder3.GetEdmModel()); 

      // ODate V4 Route 

      ODataV4.Builder.ODataModelBuilder builder4 = new ODataV4.Builder.ODataConventionModelBuilder(); 

      builder4.EntitySet<MarvelCharacter>("MarvelCharactersV4"); 
      ODataV4.Extensions.HttpConfigurationExtensions.MapODataServiceRoute(
       configuration: config, 
       routeName: "Marvel4", 
       routePrefix: "dude4", 
       model: builder4.GetEdmModel()); 
     } 
    } 
} 

MarvelCharactersV3 (OData 3):

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using System.Web.Http.OData; // OData V3 
using System.Web.Http.OData.Query; 
using Microsoft.Data.OData; 
using MyProject; 

namespace MyProject.Controllers 
{ 
    public class MarvelCharactersV3Controller : ODataController 
    { 
     private static ODataValidationSettings _validationSettings = new ODataValidationSettings(); 

     // GET: odata/MarvelCharacters 
     public IHttpActionResult GetMarvelCharactersV3(ODataQueryOptions<MarvelCharacter> queryOptions) 
     { 
      // validate the query. 
      try 
      { 
       queryOptions.Validate(_validationSettings); 
      } 
      catch (ODataException ex) 
      { 
       return BadRequest(ex.Message); 
      } 

      var entities = new myEntities(); 
      var marvelCharacters = (from c in entities.MarvelCharacters select c).ToList(); 

      return Ok<IEnumerable<MarvelCharacter>>(marvelCharacters); 
     } 
    } 
} 

MarvelCharactersV4 (OData 4):

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using System.Web.OData; // OData 4 
using System.Web.OData.Query; 
using Microsoft.Data.OData; 
using MyProject; 

namespace MyProject.Controllers 
{ 
    public class MarvelCharactersV4Controller : ODataController 
    { 
     private static ODataValidationSettings _validationSettings = new ODataValidationSettings(); 

     // GET: odata/MarvelCharacters 
     public IHttpActionResult GetMarvelCharactersV4(ODataQueryOptions<MarvelCharacter> queryOptions) 
     { 
      // validate the query. 
      try 
      { 
       queryOptions.Validate(_validationSettings); 
      } 
      catch (ODataException ex) 
      { 
       return BadRequest(ex.Message); 
      } 

      var entities = new myEntities(); 
      var marvelCharacters = (from c in entities.MarvelCharacters select c).ToList(); 

      return Ok<IEnumerable<MarvelCharacter>>(marvelCharacters); 
     } 
    } 
} 

En iyi mimarisi (I will muhtemelen değil muhtemelen simi birleştirmek için bir kütüphane oluşturmak kontrolörler arasında lar kodu, ama ben test ettik ve OData 3 ve OData 4 ile başarılı bir şekilde sorgulayabiliyorum, bu yüzden şimdilik bunun için yeterince mutluyum.

+8

Microsoft'un gerçekten de 'OdataV3' ve 'OdataV4' adlarında yeni sürümleri takmak yerine kullanmış olmasını diliyorum ve buradaki takma adlar için nilly +1 - harika bir fikir – bkwdesign

+0

Aynı sorunu yaşıyorum oData v3 ile ilk kurulum ve daha sonra oData v4'e taşındı ve V4 ile oluşturulan denetleyiciler 406 hatası vermeye başladı. Sorunu doğrulamak için tekrar V3 ile bir kontrolör oluşturduk ve evet çalışmaya başlıyor. Şimdi herkes için V4'e geçiyorum. – Zafar

+1

Çok teşekkür ederim! –

İlgili konular