【问题标题】:Getting System.InvalidOperationException exception with breeze and WebApi使用微风和 WebApi 获取 System.InvalidOperationException 异常
【发布时间】:2013-10-12 23:18:11
【问题描述】:

我对微风很陌生。我已经下载了 AngularBreeze 的模板并尝试创建一个示例应用程序,但我被困在 Breeze WebApi 控制器上。

BreezeController]
public class ProductsBreezeController : ApiController
{
    private readonly ProductRepository context;

    public ProductsBreezeController()
    {
        context = new ProductRepository();
    }

    [HttpGet]
    public string Metadata()
    {
        return context.Metadata();
    }

    //// GET api/productsbreeze
    public IQueryable<Product> GetAllProducts()
    {
        return context.TodoLists;
    }
}

public class ProductRepository : EFContextProvider<SampleEntities>
{
    public DbQuery<Product> TodoLists
    {
        get { return Context.Products; }
    }
}

异常消息

找到与请求匹配的多个操作:AngularWebApi.ApiControllers.ProductsBreezeController System.Linq.IQueryable`1[AngularWebApi.DataAccess.Model.Product] AngularWebApi.ApiControllers 类型上的 System.String Metadata()。产品BreezeController

ExceptionType:“System.InvalidOperationException”

【问题讨论】:

    标签: asp.net-mvc angularjs asp.net-web-api breeze


    【解决方案1】:

    您需要像我们一样将您的微风webapiconfig.cs 设置为接受一个操作参数。目前你可能只有一个控制器。

    打开 appstart 文件夹和 BreezeWebApiConfig.cs 并将其添加到那里(应该看到类似的内容)-

    Breeze/{controller}/{action}/{id} 
    

    你需要在里面添加动作部分

    编辑

    在您的问题中,它清楚地显示了该控制器操作的路线是 api/productsbreeze。如果那是您要到达的路线,那么您也需要调整该路线以接受操作。如果它是您尝试访问的 Breeze 路由,则在操作上添加一个 HttpGet 控制器属性

    //// GET api/productsbreeze
    [HttpGet]
    public IQueryable<Product> GetAllProducts()
    {
        return context.TodoLists;
    }
    

    当然,您需要确保您的 BreezeWebApiConfig 也在 Global.asax 中注册。

    【讨论】:

    • 我添加了,但仍然是同样的错误public static class BreezeWebApiConfig { public static void RegisterBreezePreStart() { GlobalConfiguration.Configuration.Routes.MapHttpRoute("BreezeApi", "breeze/{controller}/{action}" ); GlobalConfiguration.Configuration.Routes.MapHttpRoute("BreezeDefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional } ); } }
    • 那么应该有什么?
    • {action} 应该在控制器之后。在 API 路由上也是如此
    • 就是你说的GlobalConfiguration.Configuration.Routes.MapHttpRoute("BreezeApi", "breeze/{controller}/{action}/{id} ", new { id = RouteParameter.Optional } );
    • 我稍微调整了答案。我不确定您要访问的 URL 到底是什么,但您需要确保它已正确装饰,并且您的配置接受并处理操作参数
    【解决方案2】:

    请求的 URL 应该与 Breeze Api 配置相匹配。

    服务器端配置

    GlobalConfiguration.Configuration.Routes.MapHttpRoute("BreezeApi", "breeze/{controller}/{action}");
    

    客户端

    var manager = new breeze.EntityManager("/breeze/ProductsBreeze");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      • 2021-05-14
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多