2013-09-25 16 views
9

के लिए प्रतिक्रिया निकाय को क्रमबद्ध करने में विफल रहा यह एक मुझे मार रहा है। यहां कोई भी लेख और न ही वेब ने मदद की है।वेबएपीआई ओडाटा त्रुटि ऑब्जेक्ट कंटेंट प्रकार सामग्री प्रकार 'appliation/json ...'

आरंभ करने के लिए, मैं .NET 4.5 का उपयोग कर एएसपी.Net वेबफॉर्म (एमवीसी नहीं) पर काम कर रहा हूं। मुझे great article मिला जो आपको अपनी वेबफॉर्म साइट पर ओडाटा फ़ीड जोड़ने में मदद करता है। यह एक चैंप की तरह काम किया। मैं एक ईएमपीटीई वेब एप्लिकेशन बनाने और इसे काम करने में सक्षम था। हालांकि, मैंने देखा कि यह नवीनतम (और माना जाता है कि आसान) EntitySetController का उपयोग नहीं कर रहा था जिसे मैंने this article के माध्यम से बनाया था। दोनों अलग से काम किया। इसके बाद मैंने यह देखने के लिए मूल आलेख को मालिश किया कि क्या यह EntitySetController को संभाल सकता है और यह हो सकता है। OData और उसके फ़िल्टरिंग का परीक्षण करने के लिए सुझाए गए Fiddler का उपयोग किया गया। ओह खुशी का दिन।

मेरा अगला कदम यह है कि मैं अपने मौजूदा एएसपी.Net 4.5 वेबफॉर्म एप्लिकेशन में जोड़ूं। यह कुछ हद तक काम कर रहा है। सब कुछ संकलित करता है तथा मैं locallhost:55777/kid में एक कॉल कर सकते हैं और यह Products रिटर्न की उम्मीद के रूप में:

<workspace> 
    <atom:title type="text">Default</atom:title> 
    <collection href="Products"> 
    <atom:title type="text">Products</atom:title> 
    </collection> 
</workspace> 

मैं तो Get या GetEntityByKey तरीकों कोशिश करते हैं और वे चलाने के लिए और वापस वे क्या करना चाहिए दे।

{ 
    "odata.error":{ 
    "code":"","message":{ 
     "lang":"en-US","value":"An error has occurred." 
    }, 
    "innererror":{ 
     "message":"The 'ObjectContent`1' type failed to serialize the response body for content type 'application/json; odata=minimalmetadata; streaming=true; charset=utf-8'.", 
     "type":"System.InvalidOperationException", 
     "stacktrace":"", 
     "internalexception":{ 
     "message":"No IdLink factory was found. Try calling HasIdLink on the EntitySetConfiguration for 'Products'.", 
     "type":"System.InvalidOperationException", 
     "stacktrace":" at System.Web.Http.OData.Builder.EntitySetLinkBuilderAnnotation.BuildIdLink(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel)\r\n 
         at System.Web.Http.OData.Builder.EntitySetLinkBuilderAnnotation.BuildEntitySelfLinks(EntityInstanceContext instanceContext, ODataMetadataLevel metadataLevel)\r\n 
         at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.CreateEntry(SelectExpandNode selectExpandNode, EntityInstanceContext entityInstanceContext)\r\n 
         at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteEntry(Object graph, ODataWriter writer, ODataSerializerContext writeContext)\r\n 
         at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteObjectInline(Object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext)\r\n 
         at System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer.WriteObject(Object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)\r\n 
         at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders)\r\n 
         at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext)\r\n--- End of stack trace from previous location where exception was thrown ---\r\n 
         at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 
         at System.Runtime.CompilerServices.TaskAwaiter.GetResult()\r\n 
         at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__10.MoveNext()" 
     } 
    } 
    } 
} 

नियंत्रक है:

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

namespace BOR.InternalWebsite.Controllers { 

    public class ProductsController : EntitySetController<Product, int> { 

     static List<Product> products = new List<Product>() { 
      new Product() { ID = 1, Name = "Hat", Price = 15, Category = "Apparel" }, 
      new Product() { ID = 2, Name = "Socks", Price = 5, Category = "Apparel" }, 
      new Product() { ID = 3, Name = "Scarf", Price = 12, Category = "Apparel" }, 
      new Product() { ID = 4, Name = "Yo-yo", Price = 4.95M, Category = "Toys" }, 
      new Product() { ID = 5, Name = "Puzzle", Price = 8, Category = "Toys" }, 
     }; 

     public override IQueryable<Product> Get() { 
      return products.AsQueryable(); 
     } 

     protected override Product GetEntityByKey(int key) { 
      return products.FirstOrDefault(p => p.ID == key); 
     } 

    } 
} 

WebApiConfig है: हालांकि, मैं निम्नलिखित त्रुटि संदेश प्राप्त

using Microsoft.Data.Edm; 
using System.Web.Http; 
using System.Web.Http.OData.Builder; 

namespace BOR.InternalWebsite { 

    public static class WebApiConfig { 

     public static void Register(HttpConfiguration config) { 
      config.EnableQuerySupport(); 

      ODataModelBuilder modelBuilder = new ODataModelBuilder(); 
      var products = modelBuilder.EntitySet<Product>("Products"); 

      IEdmModel model = modelBuilder.GetEdmModel(); 
      config.Routes.MapODataRoute("ODataRoute", "kid", model); 
     } 

    } 
} 

Global.asax.cs फ़ाइल के Application_Start कुछ भी नहीं लेकिन निम्नलिखित है:

WebApiConfig.Register(GlobalConfiguration.Configuration); 

बस आपको यह दिखाने के लिए कि परियोजना में मेरे पास कौन से पैकेज हैं, यहां मेरी Packages.config फ़ाइल है। मुझे पता है कि Microsoft.AspNet.WebApi.* आइटम प्री-रिलीज हैं। मैंने उन्हें वर्तमान स्थिर रिलीज में रखा था और कुछ भी अलग नहीं था इसलिए मैंने सोचा कि मैं यह देखने की कोशिश करूंगा कि प्री-रिलीज इसे ठीक करेगा या नहीं।

<?xml version="1.0" encoding="utf-8"?> 
<packages> 
    <package id="DynamicDataTemplatesCS" version="1.0.1" targetFramework="net45" /> 
    <package id="elmah" version="1.2.2" targetFramework="net45" /> 
    <package id="elmah.corelibrary" version="1.2.2" targetFramework="net45" /> 
    <package id="EntityFramework" version="5.0.0" targetFramework="net45" /> 
    <package id="jQuery" version="2.0.3" targetFramework="net45" /> 
    <package id="jquery.mobile" version="1.3.2" targetFramework="net45" /> 
    <package id="jQuery.UI.Combined" version="1.10.3" targetFramework="net45" /> 
    <package id="knockoutjs" version="2.3.0" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi" version="5.0.0-rc1" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Client" version="5.0.0-rc1" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.Core" version="5.0.0-rc1" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.OData" version="5.0.0-rc1" targetFramework="net45" /> 
    <package id="Microsoft.AspNet.WebApi.WebHost" version="5.0.0-rc1" targetFramework="net45" /> 
    <package id="Microsoft.Bcl" version="1.1.3" targetFramework="net45" /> 
    <package id="Microsoft.Bcl.Build" version="1.0.10" targetFramework="net45" /> 
    <package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net45" /> 
    <package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net45" /> 
    <package id="Microsoft.Net.Http" version="2.2.15" targetFramework="net45" /> 
    <package id="Newtonsoft.Json" version="5.0.6" targetFramework="net45" /> 
    <package id="System.Spatial" version="5.6.0" targetFramework="net45" /> 
    <package id="Twitter.Bootstrap" version="3.0.0" targetFramework="net45" /> 
</packages> 

चूंकि मैं इसे अकेले काम करने के लिए प्राप्त कर सकता हूं, मुझे लगता है कि कुछ रास्ते में हो रहा है। किसी भी उपयोगी मदद की सराहना की जाएगी! TIA!

संपादित करें == समाधान

धन्यवाद केवल एक चीज को बदलने की जरूरत है कि था WebApiConfig रजिस्टर विधि @RaghuRam करने के लिए। अद्यतन और इस तरह के कामकाजी संस्करण निम्नानुसार है:

config.EnableQuerySupport(); 

ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
var products = modelBuilder.EntitySet<Product>("Products"); 

IEdmModel model = modelBuilder.GetEdmModel(); 
config.Routes.MapODataRoute("ODataRoute", "kid", model); 

बहुत बढ़िया!

उत्तर

10
ODataModelBuilder के बजाय

, इस तरह ODataConventionModelBuilder उपयोग करते हैं,

var modelBuilder = new ODataConventionModelBuilder(); 
var products = modelBuilder.EntitySet<Product>("Products"); 

IEdmModel model = modelBuilder.GetEdmModel(); 

एक बहुत कम स्तर का इरादा जब आप स्पष्ट रूप से पूरे मॉडल कॉन्फ़िगर करना चाहते हैं इस्तेमाल किया जा रहा वर्ग है। आपको इसे प्रत्येक संपत्ति, प्रत्येक नेविगेशन संपत्ति और फिर स्वयं-लिंक (आईडी, संपादित और पढ़ना) और नेविगेशन लिंक बताने की आवश्यकता है।

ODataConventionModelBuilder दूसरी ओर, इन चीजों को स्वचालित रूप से इन चीजों का अनुमान लगाने के लिए कुछ सम्मेलन हैं। यदि आप सम्मेलनों से विचलित हो जाते हैं तो आपको केवल ODataConventionModelBuilder के साथ कुछ स्पष्ट रूप से कॉन्फ़िगर करने की आवश्यकता है।

आप अभी भी ODataModelBuilder वर्ग का उपयोग करना चाहते हैं, तो आप इस तरह कोड लिखना चाहिए,

ODataModelBuilder modelBuilder = new ODataModelBuilder(); 
var products = modelBuilder.EntitySet<Product>("Products"); 
var product = products.EntityType; 

product.HasKey(p => p.ID); 
product.Property(p => p.Name); 
product.Property(p => p.Price); 
product.Property(p => p.Category); 

products.HasIdLink((ctxt) => ctxt.Url.ODataLink(new EntitySetPathSegment("Products"), new KeyValuePathSegment(ctxt.EntityInstance.ID))); 

IEdmModel model = modelBuilder.GetEdmModel(); 

चीजें अधिक जटिल हो एक बार आप नेविगेशन गुण और संबंधित entitysets आदि

+0

कृपया अपना उत्तर अद्यतन करते हैं, आप पहले उदाहरण में पुराने का उपयोग कर रहे हैं –

संबंधित मुद्दे