首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >控制器没有默认构造函数500内部服务器错误

控制器没有默认构造函数500内部服务器错误
EN

Stack Overflow用户
提问于 2012-10-26 13:29:22
回答 4查看 9.3K关注 0票数 3

这是我的控制器

代码语言:javascript
运行
复制
 public class SuggestionController : ApiController
{
    public ISuggestionRepository Repository { get; private set; }

    public SuggestionController(ISuggestionRepository repository)
    {
        this.Repository = repository;
    }

    // to post suggestion
    [HttpPost]
    [ActionName("PostSuggestion")]
    public HttpResponseMessage PostSuggestion(Suggestion suggestion)
    {
        var answerCorrect = this.Repository.CreateSuggestion(suggestion);

        if (answerCorrect == true)
            return Request.CreateResponse(HttpStatusCode.OK);
        else
            return Request.CreateResponse(HttpStatusCode.Conflict);
    }
}

这是我在NinjectWebCommon.cs中的RegisterServices方法

代码语言:javascript
运行
复制
private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ICompetitionRepository>().To(typeof(CompetitionRepository))
            .WithConstructorArgument("serviceContext", new InMemoryDataContext<Competition>());

        kernel.Bind<ISubmissionRepository>().To(typeof(SubmissionRepository))
            .WithConstructorArgument("serviceContext", new InMemoryDataContext<Submission>());

        kernel.Bind<IUserRepository>().To(typeof(UserRepository))
            .WithConstructorArgument("serviceContext", new InMemoryDataContext<User>());

        kernel.Bind<ISuggestionRepository>().To(typeof(SuggestionRepository))
           .WithConstructorArgument("serviceContext", new InMemoryDataContext<Suggestion>());
    } 

但是我得到了一个异常,我的建议控制器没有默认的构造函数,当我从客户端应用程序点击控制器时,它显示了一个500内部服务器

我知道,如果对象依赖不能正常工作,我们会得到控制器没有默认构造函数的异常,但下面是我实现的另一个控制器,类似于suggestion控制器,它工作得非常好。

代码语言:javascript
运行
复制
 public IUserRepository Repository { get; private set; }

    public SSOController(IUserRepository repository)
    {
        this.Repository = repository;
    }

    [HttpPost]
    [ActionName("PostUser")]
    public HttpResponseMessage PostUser([FromBody]string id)
    {
        var accessToken = id;
        var client = new FacebookClient(accessToken);
        dynamic result = client.Get("me", new { fields = "name,email" });
        string name = result.name;
        string email = result.email;


        var existingUser = this.Repository.FindByUserIdentity(name);

        if (existingUser == null)
        {
            var newUser = new User
            {
                Username = name,
                Email = email,

            };

            var success = this.Repository.CreateAccount(newUser);

            if (!success)
            {
                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            }

            //return created status code as we created the user
            return Request.CreateResponse<User>(HttpStatusCode.Created, newUser);
        }

        return Request.CreateResponse(HttpStatusCode.OK);

    }

}

我不知道哪里出了问题。如果你有任何建议,请告诉我。

编辑:

我的Global.asax

代码语言:javascript
运行
复制
 public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        AuthConfig.RegisterAuth();

        GlobalConfiguration.Configuration.IncludeErrorDetailPolicy =
IncludeErrorDetailPolicy.Always;

    }

依赖关系解析器正在使用

代码语言:javascript
运行
复制
 // Provides a Ninject implementation of IDependencyScope
// which resolves services using the Ninject container.
public class NinjectDependencyScope : IDependencyScope
{
    IResolutionRoot resolver;

    public NinjectDependencyScope(IResolutionRoot resolver)
    {
        this.resolver = resolver;
    }

    public object GetService(Type serviceType)
    {
        if (resolver == null)
            throw new ObjectDisposedException("this", "This scope has been disposed");

        return resolver.TryGet(serviceType);
    }

    public System.Collections.Generic.IEnumerable<object> GetServices(Type serviceType)
    {
        if (resolver == null)
            throw new ObjectDisposedException("this", "This scope has been disposed");

        return resolver.GetAll(serviceType);
    }

    public void Dispose()
    {
        IDisposable disposable = resolver as IDisposable;
        if (disposable != null)
            disposable.Dispose();

        resolver = null;
    }
}

// This class is the resolver, but it is also the global scope
// so we derive from NinjectScope.
public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver
{
    IKernel kernel;

    public NinjectDependencyResolver(IKernel kernel)
        : base(kernel)
    {
        this.kernel = kernel;
    }

    public IDependencyScope BeginScope()
    {
        return new NinjectDependencyScope(kernel.BeginBlock());
    }
}

并在NinjectWebCommon的CreateKernel()方法中调用它

代码语言:javascript
运行
复制
 private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);

        // Install our Ninject-based IDependencyResolver into the Web API config
        GlobalConfiguration.Configuration.DependencyResolver = new NinjectDependencyResolver(kernel);

        return kernel;
    }

建议存储库

代码语言:javascript
运行
复制
 public class SuggestionRepository : Repository<Suggestion>, ISuggestionRepository
{
    public SuggestionRepository(IServiceContext<Suggestion> servicecontext)
        : base(servicecontext)
    { }

    public bool CreateSuggestion(Suggestion suggestion)
    {
        this.ServiceContext.Create(suggestion);
        this.ServiceContext.Save();

        return true;
    }
}

ISuggestionRepository

代码语言:javascript
运行
复制
public interface ISuggestionRepository
{
    bool CreateSuggestion(Suggestion suggestion);

}

存储库

代码语言:javascript
运行
复制
public abstract class Repository<T>
{
    public IServiceContext<T> ServiceContext { get; private set; }

    public Repository(IServiceContext<T> serviceContext)
    {
        this.ServiceContext = serviceContext;
    }
}

IserviceContext

代码语言:javascript
运行
复制
 public interface IServiceContext<T>
{
    IQueryable<T> QueryableEntities { get; }

    void Create(T entity);

    void Update(T entity);

    void Delete(T entity);

    void Save();
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-26 14:01:58

由于您使用的是WebApi,因此需要使用WebApi扩展。不幸的是,当前的Ninject.WebApi nuget包已经过时了,并且不能与WebApi的发布版本一起工作。

暂时,在Remo开始将Ninject.WebApi更新到发行版之前,您可以使用Ninject.WebApi-RC http://nuget.org/packages/Ninject.Web.WebApi-RC

http://www.eyecatch.no/blog/2012/06/using-ninject-with-webapi-rc/

编辑:

为了重述评论中讨论的信息,以下是建议:

1)如上所述使用Ninject.MVC3和Ninject.Web.WebApi (但使用Ninject.Web.WebApi-RC直到官方更新)。不要使用自定义的DependencyResolver,让Ninject.Web.Mvc和.WebApi来做他们的工作。

2)将您的绑定更改为:

代码语言:javascript
运行
复制
kernel.Bind<ICompetitionRepository>().To<CompetitionRepository>();
... similar bindings

3)为您的ServiceContext添加通用绑定

代码语言:javascript
运行
复制
kernel.Bind(typeof(IServiceContext<>)).To(typeof(InMemoryDataContext<>));
票数 2
EN

Stack Overflow用户

发布于 2012-10-26 14:05:13

我认为问题在于您使用的是ApiController。控制器和apiControllers使用不同的依赖注入容器。但是,它们都公开了相同的方法。

如果工作控制器继承了controller类,那么这就是您的原因。

有关变通方法,请查看this topic

票数 0
EN

Stack Overflow用户

发布于 2013-03-31 08:50:11

我也遇到过同样的问题。

这就是我如何修正的:我创建了一个WebContainerManager,它只是一个容器的静态包装器。

当您不能控制实例化并且不能依赖注入时,静态容器包装器非常有用-例如操作过滤器属性

代码语言:javascript
运行
复制
public static class WebContainerManager
{
    public static IKernel GetContainer()
    {
        var resolver = GlobalConfiguration.Configuration.DependencyResolver as NinjectDependencyResolver;
        if (resolver != null)
        {
            return resolver.Container;
        }

        throw new InvalidOperationException("NinjectDependencyResolver not being used as the MVC dependency resolver");
    }

    public static T Get<T>()
    {
        return GetContainer().Get<T>();
    }
}

在你的控制器内部,像这样不带参数地调用你的空构造函数:

代码语言:javascript
运行
复制
public SuggestionController() : this(WebContainerManager.Get<ISuggestionRepository>())
{

}

这应该是可行的。

这是我从Jamie Kurtz @jakurtz写的关于MVC4的书中得到的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13081257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档