编辑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>();
}
答案 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