使用DataJs的Asp.Net WebApi OData会抛出错误

时间:2012-12-21 22:42:40

标签: asp.net-web-api odata datajs

我刚创建了一个非常简单的ASP.Net WebApi项目。我使用NuGet在WebAPI-RC版本中下载最新的OData。我还通过NuGet下载DataJs和Knockout。我所有的依赖都是最新的。我创建了一个简单的“Books”类,并使用HttpConfiguration.EnableOData(IEdmModel)将所有内容连接在一起。我还将[Queryable]属性添加到控制器中的Get动作中。没有涉及数据库,我硬编码了我想要返回的数据。基本上,我使用WebApi和OData进行了最少量的更改以运行我的项目。

当我尝试使用DataJs查询OData服务时,我在响应中得到500内部服务器错误,但如果我直接浏览到URL,我可以看到XML数据。我已经包含了请求,响应,我的C#类,Javascript代码和Global.asax代码。为了让这个工作,我错过了什么?

请求

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#Class

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 个答案:

答案 0 :(得分:1)

EnableOData实际上为您注册了路由,但由于您在路由运行之前注册了路由,因此这些路由优先。如果您删除此行:

RouteConfig.RegisterRoutes(RouteTable.Routes);

我认为它应该成功。该请求需要进入OData路由以使OData格式化工作,因为路由解析OData路径并为格式化程序提供有关正在访问的实体集等信息。