使用Web Api控制器

时间:2015-04-17 18:29:26

标签: asp.net asp.net-web-api

错误消息报告的问题是:

  

"尝试创建' BooksController'类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。"

我试图让控制器成功执行和/或返回一个值。

这是一个使用AngularJs应用程序作为前端的WebApi项目。对此控制器的任何调用都会返回500错误,并显示上述消息。 我还要补充说我正在使用Insight.Database

我尝试过创建一个新控制器并添加和删除构造函数。但我无法更好地了解我做错了什么。

using System; 
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Data.SqlClient;
using System.Configuration;
using System.Threading.Tasks; 
using Insight.Database;
using Owin;
using Microsoft.Owin;
using Microsoft.Owin.Security.OAuth;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.SqlServer;
using Wallet.Models.Books;
using Wallet.Models.Stores; 
using Wallet.Models.Database;

namespace Wallet.Controllers
{
    [Authorize]
    [RoutePrefix("api/books")]
    public class BooksController : ApiController
    {
        private IBooksDataAccess access; 
        public BooksController()
        {
            access = HttpContext.Current.GetOwinContext().Get<SqlConnection>()
                .As<IBooksDataAccess>(); 
        }

        // POST api/books/GetActions
        [HttpPost]
        [Route("GetActions")] 
        public IList<HistoryAction> ActionsHH([FromBody] Dictionary<string, string> input)
        {
            var name = input["name"]; 
            var results = access.GetHistoricalActions(name); 
            return results; 
        }

        // POST api/books/InsertTransaction
        [HttpPost]
        [Route("InsertTransaction")] 
        public void InsertTx([FromBody] Dictionary<string, string> input)
        {
        }
    }
}

这里是IBookDataAccess

namespace Wallet.Models.Database
{
    [Sql(Schema = "Models")]
    public interface IBooksDataAccess
    {
        IList<HistoryAction> GetHistoricalActions(string UserName);
        int InsertTransaction(Dictionary<string, string> transaction); 
    }
}

1 个答案:

答案 0 :(得分:0)

当控制器找不到无参数构造函数时,或者在构造函数中抛出异常的情况下,将发生此错误。看起来您正在使用Insight.Database,因为。作为扩展。

如果Insight无法生成动态程序集,它将抛出异常(您没有捕获,因为您在成员声明中实例化了insight自动界面构建器。)

我将不得不做一些测试,但我相信我记得将“事务”这个名称解释为T-SQL类型的问题。

您可以尝试为控制器创建构造函数,并在其内部的try / catch块内分配数据库对象吗?