2017-03-29 8 views
4

Microsoft.AspNetCore.OData.vNextパッケージを使用しているASPNetコアWeb APIアプリケーションがあります。クエリ文字列を使用してOData機能を使用しようとすると、MissingManifestResourceExceptionが返されます。ここでは、コードの問題である:ODataクエリ文字列を使用するとMissingManifestResourceExceptionがスローされる

[EnableQuery] 
[HttpGet()] 
public class LocationsController : Controller 
{ 
    public IActionResult GetLocations() 
    { 
    IQueryable<Location> locationEntities = _locationInfoRepo.GetLocations(); 
    if (locationEntities == null) 
    { 
     return NotFound(); 
    } 

    var results = Mapper.Map<IEnumerable<LocationDTO>>(locationEntities); 

    return Ok(results); 
    } 
} 

注:私はすでにIActionResultからのIQueryable <>に無駄にする方法でタイプを変更しようとしました。私はAutomapper Mapメソッドをコメントアウトして、そこに問題がないことを確認しました。

ここではデータを返すために、EFを利用している方法です:?http://localhost/api/locations $フィルタ=名%20eq%20'Bob '

' 名前:

public IQueryable<Location> GetLocations() 
{ 
    return _context.Locations; 
} 

ここでは、クエリ文字列と一緒にURLがあります'はモデルで指定された文字列フィールドであり、データベースの列です。

スタックトレース:

System.Resources.MissingManifestResourceException: Could not find any resources appropriate for the specified culture or the neutral culture. Make sure "Microsoft.AspNetCore.OData.SRResources.resources" was correctly embedded or linked into assembly "Microsoft.AspNetCore.OData.vNext" at compile time, or that all the satellite assemblies required are loadable and fully signed. 
    at System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName) 
    at System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark) 
    at System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents) 
    at System.Resources.ResourceManager.GetString(String name, CultureInfo culture) 
    at Microsoft.AspNetCore.OData.SRResources.GetString(String name, String[] formatterNames) 
    at Microsoft.AspNetCore.OData.SRResources.get_ClrTypeNotInModel() 
    at Microsoft.AspNetCore.OData.ODataQueryContext..ctor(IEdmModel model, Type elementClrType, ODataPath path) 
    at Microsoft.AspNetCore.OData.EnableQueryAttribute.OnActionExecuted(ActionExecutedContext context) 
    at Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute.<OnActionExecutionAsync>d__6.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextActionFilterAsync>d__25.MoveNext() 
    --- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextExceptionFilterAsync>d__24.MoveNext() 

誰かが正しい方向に私を指すことができますか?

+0

WebApi GitHubプロジェクトでODataチームと開いた問題を相互参照するには、その問題へのリンクがあります:https://github.com/OData/WebApi/issues/955 –

答えて

0

私はあなたのソリューションに何があるのか​​わかりませんが、私はこの問題が発生したときに私のコントローラから[RouteAttribute]を削除するだけで解決しました。私はあなたに実例を示してみましょう。 、そして、

public void ConfigureServices(IServiceCollection services) 
{ 
    // Your stuff... 
    services.AddOData(opt => opt.RoutingConventions 
            .Insert(0, new DefaultODataRoutingConvention())); 
    // Your stuff... 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    // Your stuff... 
    var provider = app.ApplicationServices.GetRequiredService<IAssemblyProvider>(); 
    var model = GetEdmModel(provider); 
    app.UseMvc(builder => builder 
     .MapODataRoute("odata", model) 
     .MapRoute("default", "api/{controller}/{id?}")); 
} 

private static IEdmModel GetEdmModel(IAssemblyProvider assemblyProvider) 
{ 
    var builder = new ODataConventionModelBuilder(assemblyProvider); 
    builder.EntitySet<Product>("Products"); 

    return builder.GetEdmModel(); 
} 

あなたのコントローラにあなたが持っている必要があります:あなたが持っている必要がありStartup.csで

MapODataRouteのODataで

[EnableQuery] 
public class ProductsController : Controller 
{   
    private readonly IProductDbContext _dbContext; 

    public ProductsController(IProductDbContext dbContext) 
    { 
     _dbContext = dbContext; 
    }   

    [HttpGet] 
    public IQueryable<Product> Get() 
    { 
     return _dbContext.Products.AsQueryable(); 
    } 
} 

は、任意の属性の必要性whithout ProductControllerを見つけることができますまたはカスタムルーティングをご利用いただけます(hereを参照してください)。

したがって、RouteAttributeは不要で、このクエリ「http://localhost:44302/odata/Products?$ top = 2 & $ skip = 2」は正常に動作するはずです。

おそらく、私たちがあなたを助けるためのより詳細なコードを投稿することができます。あなたがあなたの問題を解決したことを願っています。

+0

これは興味深い溶液。私はこの問題に遭遇して以来、私は完全な.NETアーキテクチャーに移行し、完全なODataに移行しました。それはうまくいっているようだが、AspNetCoreを適切に動かすことができなかったのはちょっとうんざりだ。たぶん私の次のプロジェクトで、私はあなたの解決策でこれをもう一度試してみるでしょう。情報のおかげで! –

関連する問題