ASP.NET5 500使用存储库模式时出错

时间:2016-01-02 00:53:13

标签: c# asp.net asp.net-core asp.net-core-mvc

编辑3:我不知道我为解决这个问题做了什么,但我的问题消失了。我认为我发现的最重要的事情,如果你有这个问题就带走,那就是在ASP.NET 5 MVC 6中我们必须为几乎所有内容添加中间件,包括使用app.UseDeveloperExceptionPage();的开发人员错误页面...之后我意识到堆栈跟踪可能是指在控制器中引用的其他类,例如存储库和上下文对象,在我的例子中。我和他们搞砸了一点,但我不记得改变任何事情。我想我的存储库类的构造函数中可能有一个拼写错误。

我的控制器出现了500内部服务器错误,但它显示的静态json数据没有构造函数就好了。我怀疑内置依赖注入有问题,但我无法理解,因为我在构建过程中没有收到任何错误或警告。

编辑:导航到http://localhost:5000/api/blogpost/时,我在浏览器中看到绝对。只是一个空白页面。没有错误。没什么。使用Postman发送HTTP请求,我得到错误代码500.再次,通过注释掉构造函数,我看到{"name":"Cameron"},并在浏览器和邮递员中获得代码200 OK。 VS中没有例外,输出控制台也没有错误。

编辑2:我找到了中间件app.UseDeveloperExceptionPage();并且它产生了MissingMethodException: No parameterless constructor defined for this object. - 如果我创建一个无参数构造函数,它会产生:InvalidOperationException: Multiple constructors accepting all given argument types have been found in type 'MyApp.Controllers.BlogPostController'. There should only be one applicable constructor. - 看起来像是在发生什么样的事情.NET5的dep注入?

这是我的控制器:

using MyApp.Data.Repository;
using MyApp.Models;
using Microsoft.AspNet.Mvc;
using System;

    namespace MyApp.Controllers
    {
        [Route("api/[controller]")]
        public class BlogPostController : Controller
        {
            // If I comment out this var and the constructor this works.
            private IBlogPostRepository _repository;

            // If I leave them here, I get a 500 Internal Server Error.
            // If I set a breakpoint here, it never fires.
            // If I create a constructor that takes zero args, it never fires.
            // I do not get any errors.
            public BlogPostController(IBlogPostRepository repository)
            {
                _repository = repository;
            }

            [HttpGet]
            public JsonResult Get()
            {
                return Json(new { name = "Cameron" });
            }
        }
    }

这是Startup.cs ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    // MVC 6
    services.AddMvc();

    // EntityFramework 7
    services.AddEntityFramework()
        .AddSqlServer()
        .AddDbContext<AppDbContext>(options =>
        {
            // Will use the last Data:DefaultConnection:ConnectionString
            // that was loaded from the config files in the constructor.
            options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"]);
        });

    // Injections
    services.AddTransient<AppDbContextSeedData>();
    services.AddScoped<IBlogPostRepository, BlogPostRepository>();
}

2 个答案:

答案 0 :(得分:2)

我有同样的问题。我的构造函数没有范围。这堂课是公开的,所以我添加了#34; public&#34;在构造函数之前它工作了!

所以,不工作:

public class VisualizationsController : Controller
{
VisualizationsController() {...}
}

工作:

public class VisualizationsController : Controller
{
public VisualizationsController() {...}
}

答案 1 :(得分:1)

我遇到的情况是我添加了另一个控制器而忘记更新Startup.cs页面。

在Startup.cs中,在ConfigureServices下,尝试添加:

services.AddSingleton<ISomeRepository, SomeRepository>();
services.AddSingleton<ISomeOtherRepository, SomeOtherRepository>();

假设您在新控制器构造函数中传递了ISomeOtherRepository