1

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

当我尝试使用 DataJs 查询 OData 服务时,我在响应中收到 500 Internal Server Error,但如果我直接浏览到 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

回复

{
  "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);
        });
    }
});

全球.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");
    }
}
4

1 回答 1

1

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

RouteConfig.RegisterRoutes(RouteTable.Routes);

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

于 2012-12-22T00:43:26.747 回答