簡體   English   中英

使用OData查詢字符串時拋出MissingManifestResourceException

[英]MissingManifestResourceException thrown when using OData query string

我有一個ASPNet Core Web API應用程序,它使用Microsoft.AspNetCore.OData.vNext包。 當使用查詢字符串嘗試使用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返回數據的方法:

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

這是URL和查詢字符串: http:// localhost / api / locations ?$ filter = Name%20eq%20'Bob'

“名稱”是模型中指定的字符串字段,是數據庫中的列。

堆棧跟蹤:

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()

有人能指出我正確的方向嗎?

我不知道你的解決方案有什么,但是當我遇到這個問題時,我已經解決了從控制器中刪除[RouteAttribute]的問題。 讓我告訴你一個有效的例子。

在Startup.cs中你應該:

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();
}

然后,在您的控制器中,您應該:

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

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

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

使用MapODataRoute,OData可以找到ProductController,而不需要任何屬性或自定義路由,您可以在此處查看

因此,不需要RouteAttribute,並且此查詢“ http:// localhost:44302 / odata / Products ?$ top = 2&$ skip = 2”現在應該可以正常工作。

也許,您可以發布更詳細的代碼,以便我們能夠為您提供幫助。 希望你解決了你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM