2017-02-12 13 views
0

.Net Core 1.1をMicrosoft.AspNetCore.ODataライブラリと共に使用すると、私は単純なコントローラでget、$ expandおよびを実行するODataエンドポイントを取得できます。他のクエリ。しかし、返される$メタデータを返すことはできません。この質問($Metadata with WebAPi OData Attribute Routing Not Working)は同じ問題ですが、.Net APIはこれが投稿されて以来変更されています。

有効にするために設定、フラグなどが必要ですか?

An unhandled exception occurred while processing the request. 
NotSupportedException: No action match template '$metadata' 
in 'MetadataController' 

Microsoft.AspNetCore.OData.Routing.Conventions.DefaultODataRoutingConvention.SelectAction(RouteContext routeContext) 

マイStartup.csは次のようになります:

これ(http://localhost:52315/odataは)私にエラーを与える

{ 
    "@odata.context":"http://localhost:52315/odata/$metadata","value":[ 
    { 
     "name":"Users","kind":"EntitySet","url":"Users" 
    },{ 
     "name":"HelloComplexWorld","kind":"FunctionImport","url":"HelloComplexWorld" 
    } 
    ] 
} 

この(http://localhost:52315/odata/ $メタデータ)、メタデータを返すように見えます

public void Configure(IApplicationBuilder app) { 
    app.UseDeveloperExceptionPage(); 
    app.UseOData("odata"); 
    app.UseMvcWithDefaultRoute(); 
} 

public void ConfigureServices(IServiceCollection services) { 
    services.AddMvc().AddWebApiConventions(); 
    services.AddSingleton<ISampleService, ApplicationDbContext>(); 
    services.AddOData<ISampleService>(builder => 
    { 
     builder.Namespace = "Sample"; 
     builder.EntityType<ApplicationUser>(); 
     builder.EntityType<Product>(); 
     builder.Function("HelloComplexWorld").Returns<Permissions>(); 
    }); 
} 

注:コンバージョンの開始時にこれを追加して回避することができますfigureServices(...)メソッドですが、メタデータのサポートはコアプラットフォームの一部でなければなりません。

app.Use(async (context, next) => { 
    if (0 == string.Compare(context.Request.Path, @"/odata/$metadata", true)) { 
     context.Request.Path = "/odata"; 
    } 
    await next.Invoke(); 
}); 

答えて

0

/ODATA/$メタデータルートは(the OData v4 Web API documentationによる)(EDMX) "サービスのデータモデルのXML表現" を返す必要があります。これはサービスルート/odata/と同じではありません。これは、ODataサービスによって公開されているリソースの最上位レベルの説明を返します(例のように)。

公式リリースがまだ利用できないため、プレリリース版Microsoft.AspNetCore.OData 1.0.0-rtm-00015を使用して同じ問題が発生しました(see open issue on OData Web API repo)。

この点を説明するために、以下の例のようにメタデータを手動で出力することができます。 (InMemoryMessageクラスは、OData/odata.net GitHubリポジトリにあります)

ただし、私はOData ASP.NET Coreの公式リリースを待つことをお勧めします。上記の問題を引用すると、 "branch isまだ初期段階にあり、アーキテクチャを完成させたら別のアプローチを取るかもしれません。だから事はうまく変わるかもしれません...そして$メタデータは間違いなく "すぐに"働かなければなりません!

 app.Use((context, func) => 
     { 
      if (context.Request.Path.StartsWithSegments(new PathString("/data/v1/$metadata"), StringComparison.OrdinalIgnoreCase)) 
      { 
       var model = app.ApplicationServices.GetService<IEdmModel>(); 

       MemoryStream stream = new MemoryStream(); 
       InMemoryMessage message = new InMemoryMessage() {Stream = stream}; 

       ODataMessageWriterSettings settings = new ODataMessageWriterSettings(); 

       ODataMessageWriter writer = new ODataMessageWriter((IODataResponseMessage)message, settings, model); 
       writer.WriteMetadataDocument(); 

       string output = Encoding.UTF8.GetString(stream.ToArray()); 

       return context.Response.WriteAsync(output); 
      } 

      return func(); 
     }); 
1

今日はこれを再訪し、Microsoft.AspNetCore.OData.vNext 6.0.2-α-RTMパッケージを使用してより多くの成功を持っていました。参照thisの例では、メタデータと既定のODataルーティングが期待通りに機能しました。最小構成:

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddOData(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     if (env.IsDevelopment()) 
     { 
      app.UseDeveloperExceptionPage(); 
     } 

     var modelBuilder = new ODataConventionModelBuilder(); 
     modelBuilder.EntitySet<Document>("Documents"); 

     app.UseMvc(builder => 
     { 
      builder.MapODataRoute("odata", modelBuilder.GetEdmModel()); 
     }); 
    } 
関連する問題