2012-12-21 47 views
0

我剛剛創建了一個非常簡單的ASP.Net WebApi項目。我使用NuGet在WebAPI - RC版本中下載最新的OData。我也通過NuGet下載DataJs和Knockout。我所有的依賴都是最新的。我創建了一個簡單的「Books」類,並使用HttpConfiguration.EnableOData(IEdmModel)將所有內容連接在一起。我還將[Queryable]屬性添加到控制器中的Get動作中。沒有涉及數據庫,我硬編碼了我想要返回的數據。基本上,我使用WebApi和OData執行了最少量的更改以運行我的項目。Asp.Net DataA WebApi OData拋出錯誤

當我嘗試使用DataJs查詢OData服務時,在響應中出現500內部服務器錯誤,但如果直接瀏覽到URL,則可以看到XML數據。我已經包含了請求,響應,我的C#類,Javascript代碼和Global.asax代碼。我錯過了什麼讓這個工作?

REQUEST

Response Headers 
Cache-Control private 
Content-Length 966 
Content-Type application/json; odata=fullmetadata; charset=utf-8 
DataServiceVersion 3.0; 
Date Fri, 21 Dec 2012 22:13:27 GMT 
Server Microsoft-IIS/8.0 
X-AspNet-Version 4.0.30319 
X-Powered-By ASP.NET 
X-SourceFiles =?UTF-8?B?YzpcdXNlcnNcanVzdGluXGRvY3VtZW50c1x2aXN1YWwgc3R1ZGlvIDIwMTJcUHJvamVjdHNcRGF0YUpzU3Bpa2VcRGF0YUpzU3Bpa2VcYXBpXEJvb2tz?= 
Request Headers 
Accept application/atomsvc+xml;q=0.8, application/json;odata=fullmetadata;q=0.7, application/json;q=0.5, */*;q=0.1 
Accept-Encoding gzip, deflate 
Accept-Language en-US,en;q=0.5 
Connection keep-alive 
Cookie glimpseState=null; glimpseLatestVersion=0.87; glimpseOptions=null; glimpseClientName=null 
Host localhost:31652 
MaxDataServiceVersion 3.0 
Referer http://{localhost}/ 
User-Agent Mozilla/5.0 (Windows NT 6.2; WOW64; rv:17.0) Gecko/20100101 Firefox/17.0 

RESPONSE

{ 
    "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=fullmetadata; charset=utf-8'.","type":"System.InvalidOperationException","stacktrace":"","internalexception":{ 
     "message":"The related entity set could not be found. The related entity set is required to serialize the payload.","type":"System.Runtime.Serialization.SerializationException","stacktrace":" at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)\r\n at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.<>c__DisplayClass8.<WriteToStreamAsync>b__7()\r\n at System.Threading.Tasks.TaskHelpers.RunSynchronously(Action action, CancellationToken token)" 
     } 
    } 
    } 
} 

C#類

namespace DataJsSpike.Models 
{ 
    public class Book 
    { 
     public string ISBN { get; set; } 

     public string Title { get; set; } 

     public string Author { get; set; } 

     public string Publisher { get; set; } 
    } 
} 

JavaScript代碼

// the URL of the first page to retrieve 
var startPage = "api/Books"; 

var viewModel = new Object(); 
viewModel.books = ko.observable(); 

// On initialization, make a request for the first page 
$(document).ready(function() { 
    LoadDataJs(); 

    function LoadDataJs() { 
     OData.read(startPage, function (data) { 
      viewModel.books(data.results); 
      ko.applyBindings(viewModel); 
     }); 
    } 
}); 

的Global.asax

public class WebApiApplication : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     WebApiConfig.Register(GlobalConfiguration.Configuration); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     var modelBuilder = new ODataConventionModelBuilder(); 
     EntityTypeConfiguration<Book> bookConfiguration = modelBuilder.Entity<Book>(); 

     bookConfiguration.HasKey(x => x.ISBN); 
     modelBuilder.EntitySet<Book>("Books"); 

     IEdmModel model = modelBuilder.GetEdmModel(); 

     GlobalConfiguration.Configuration.EnableOData(model, "api"); 
    } 
} 

回答

1

EnableOData實際上爲您註冊一個途徑,但因爲你註冊航線它跑之前,這些路由優先。如果您刪除此行:

RouteConfig.RegisterRoutes(RouteTable.Routes); 

我認爲它應該工作了。該請求需要在OData路由中使OData格式化工作,因爲路由解析OData路徑併爲格式化程序提供有關正在訪問的實體集等信息。

+0

謝謝,優素福。你是部分正確的。訣竅是移動RouteConfig.RegisterRoutes(RouteTable.Routes);和WebApiConfig.Register(GlobalConfiguration.Configuration);低於GlobalConfiguration.Configuration.EnableOData(model,「api」);. –