1

非常に単純なASP.NetWebApiプロジェクトを作成しました。NuGetを使用して、WebAPI –RCリリースの最新のODataをダウンロードしました。また、NuGetを介してDataJとKnockoutをダウンロードします。私の依存関係はすべて最新です。単純な「Books」クラスを作成し、HttpConfiguration.EnableOData(IEdmModel)を使用してすべてを相互に接続しました。また、コントローラーのGetアクションに[Queryable]属性を追加しました。関係するデータベースはありません。返されるデータをハードコーディングしました。基本的に、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

応答

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

1 に答える 1

1

EnableODataは実際にルートを登録しますが、実行前にルートを登録したため、それらのルートが優先されます。この行を削除した場合:

RouteConfig.RegisterRoutes(RouteTable.Routes);

私はそれがうまくいくはずだと思います。ルートがODataパスを解析し、アクセスされているエンティティセットなどに関する情報をフォーマッタに提供するため、ODataフォーマットが機能するためにはリクエストがODataルートに着信する必要があります。

于 2012-12-22T00:43:26.747 に答える