Asp.net I';我没有使用依赖注入,但我';“我得到了”;尝试创建类型为“的控制器时出错”;

Asp.net I';我没有使用依赖注入,但我';“我得到了”;尝试创建类型为“的控制器时出错”;,asp.net,angularjs,asp.net-web-api,dependency-injection,Asp.net,Angularjs,Asp.net Web Api,Dependency Injection,我已经看到了很多关于不恰当地使用依赖注入会导致错误的答案 尝试创建“UserController”类型的控制器时出错。确保控制器具有无参数公共构造函数 但我没有使用任何依赖注入产品,如Ninject、Unity等。 此外,这个错误不会发生在我的本地开发环境中,而是在我们的QA服务器上测试时出现的。此外,它会间歇性地发生,并且会在我的几个Web API方法中发生。它发生在多个用户和多个浏览器上 我甚至不知道在这里发布什么代码。如果您需要更多信息,请告诉我,我很乐意发布 这是一个使用AngularJ

我已经看到了很多关于不恰当地使用依赖注入会导致错误的答案

尝试创建“UserController”类型的控制器时出错。确保控制器具有无参数公共构造函数

但我没有使用任何依赖注入产品,如Ninject、Unity等。 此外,这个错误不会发生在我的本地开发环境中,而是在我们的QA服务器上测试时出现的。此外,它会间歇性地发生,并且会在我的几个Web API方法中发生。它发生在多个用户和多个浏览器上

我甚至不知道在这里发布什么代码。如果您需要更多信息,请告诉我,我很乐意发布

这是一个使用AngularJS的ASP.NET MVC/WebAPI应用程序。从客户端调用Web API控制器时出错。angular应用程序正在错误回调中接收到一个响应,其中包含一个500内部服务器错误,错误为

数据异常消息:尝试创建“UserController”类型的控制器时出错。确保控制器具有无参数公共构造函数。 数据异常类型:System.InvalidOperationException

下面是错误中提到的控制器的构造函数和调用的方法

构造器

public FranchiseUserController()
{
    _sm = new SettingManager();
    _millicare_connectionString = _sm.conn_MilliCareSvcConnectionString();
    _maa_connectionString = _sm.conn_MaaSvcConnectionString();

    if (AppConstants.OverrideSecurityLocal && _sm.ServiceConfiguration() == ServiceConfigurationValues.LOCAL)
    {
        _acsUser.Name = Environment.UserName;
        _acsUser.MaaUserGuid = _sm.developerAdGuid().ConvertAdGuidToMaaGuid();
        _acsUser.Role = _sm.app_TestUserRole();
    }
    else {
        ClaimsPrincipal userClaims = (ClaimsPrincipal)this.User;
        _acsUser.Name = ((ClaimsIdentity)userClaims.Identity).FindFirst(MiddlewareClaimTypes.Name).Value;
        _acsUser.MaaUserGuid = ((ClaimsIdentity)userClaims.Identity).FindFirst(MiddlewareClaimTypes.MaaUserGuid).Value;
        _acsUser.Role = AppConstants.RoleNotAuthorized;

        //Get user role
        if (ApplicationMiddleware.Security.Extensions.HasClaim(userClaims, AppConstants.Maint_Option, AppConstants.Maint_Action, AppConstants.Maint_SecureValue_Approver, _sm.acs_MAAFranchiseResourceMaint()))
        {
            _acsUser.Role = AppConstants.RoleApprover;
        }
        else if (ApplicationMiddleware.Security.Extensions.HasClaim(userClaims, AppConstants.Maint_Option, AppConstants.Maint_Action, AppConstants.Maint_SecureValue_Admin, _sm.acs_MAAFranchiseResourceMaint()))
        {
            _acsUser.Role = AppConstants.RoleAdmin;
        }
        else if (ApplicationMiddleware.Security.Extensions.HasClaim(userClaims, AppConstants.Resource_Option, AppConstants.Resource_Action, AppConstants.Resource_SecureValue_Franchise, _sm.acs_MAAFranchiseResourceReports()))
        {
            _acsUser.Role = AppConstants.RoleFranchise;
        }
    }
}
…以及方法

[ValidateCustomAntiForgeryToken]
[HttpPost]
public HttpResponseMessage UpdateAddress(Address_dto Value)
{
    HttpResponseMessage srvresponse = new HttpResponseMessage();

    if (_acsUser.Role == AppConstants.RoleAdmin || _acsUser.Role == AppConstants.RoleApprover)
    {
        Value.modified_user = _acsUser.Name;
        srvresponse = WrapServiceCall<string>((serviceResult, responseMessage) =>
        {
            MilliCareSvcClient().Using(svc =>
            {
                serviceResult.OperationSuccessful = svc.UpdateAddress(Value);
            });
        });
        return srvresponse;
    }
    else
    {
        var noaccessServiceResult = new ServiceResult<string>();
        noaccessServiceResult.SetUnauthorizedMessage();
        srvresponse.Content = new ObjectContent<ServiceResult<string>>(noaccessServiceResult, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
        return srvresponse;
    }
    //});
}
[ValidateCustomAntiForgeryToken]
[HttpPost]
公共HttpResponseMessageUpdateAddress(地址值)
{
HttpResponseMessage srvresponse=新的HttpResponseMessage();
if(_acsUser.Role==AppConstants.RoleAdmin | | | acsUser.Role==AppConstants.roleaprover)
{
Value.modified_user=_acsUser.Name;
srvresponse=WrapServiceCall((服务结果、响应消息)=>
{
MilliCareSVClient()。正在使用(svc=>
{
serviceResult.OperationsSuccessful=svc.UpdateAddress(值);
});
});
返回srvresponse;
}
其他的
{
var noaccessServiceResult=新ServiceResult();
noaccessServiceResult.SetUnauthorizedMessage();
srvresponse.Content=newObjectContent(noaccessServiceResult,new System.Net.Http.Formatting.JsonMediaTypeFormatter());
返回srvresponse;
}
//});
}

最有可能的是,您的控制器构造函数中有以某种方式访问HttpControllerContext的代码。您可能会遇到这样的情况,即在创建控制器之前(可能是在应用程序池重新启动期间),HttpControllerContext未就绪

最好这样做,因为它们可以在应用程序生命周期的任何时候创建。如果您使用的是DI,我建议您将复杂的逻辑移动到服务中,并且除了分配服务之外,不要在构造函数中执行任何操作。但是,由于您没有使用DI,您可以通过将逻辑移动到控制器的
Initialize
事件中,并完全删除构造函数来解决此问题

protected override void Initialize(HttpControllerContext controllerContext)
{
    base.Initialize(controllerContext);

    _sm = new SettingManager();
    _millicare_connectionString = _sm.conn_MilliCareSvcConnectionString();
    _maa_connectionString = _sm.conn_MaaSvcConnectionString();

    if (AppConstants.OverrideSecurityLocal && _sm.ServiceConfiguration() == ServiceConfigurationValues.LOCAL)
    {
        _acsUser.Name = Environment.UserName;
        _acsUser.MaaUserGuid = _sm.developerAdGuid().ConvertAdGuidToMaaGuid();
        _acsUser.Role = _sm.app_TestUserRole();
    }
    else
    {
        ClaimsPrincipal userClaims = (ClaimsPrincipal)this.User;
        _acsUser.Name = ((ClaimsIdentity)userClaims.Identity).FindFirst(MiddlewareClaimTypes.Name).Value;
        _acsUser.MaaUserGuid = ((ClaimsIdentity)userClaims.Identity).FindFirst(MiddlewareClaimTypes.MaaUserGuid).Value;
        _acsUser.Role = AppConstants.RoleNotAuthorized;

        //Get user role
        if (ApplicationMiddleware.Security.Extensions.HasClaim(userClaims, AppConstants.Maint_Option, AppConstants.Maint_Action, AppConstants.Maint_SecureValue_Approver, _sm.acs_MAAFranchiseResourceMaint()))
        {
            _acsUser.Role = AppConstants.RoleApprover;
        }
        else if (ApplicationMiddleware.Security.Extensions.HasClaim(userClaims, AppConstants.Maint_Option, AppConstants.Maint_Action, AppConstants.Maint_SecureValue_Admin, _sm.acs_MAAFranchiseResourceMaint()))
        {
            _acsUser.Role = AppConstants.RoleAdmin;
        }
        else if (ApplicationMiddleware.Security.Extensions.HasClaim(userClaims, AppConstants.Resource_Option, AppConstants.Resource_Action, AppConstants.Resource_SecureValue_Franchise, _sm.acs_MAAFranchiseResourceReports()))
        {
            _acsUser.Role = AppConstants.RoleFranchise;
        }
    }
}
注意:我不能肯定这就是应用程序中发生的情况,但是您应该始终假设在实例化控制器时没有可用的HTTP上下文


另一方面,这一逻辑看起来像一个贯穿各领域的问题。您应该在一个类中执行它,而不是在每个控制器中重复它。

该类上没有其他构造函数吗?如果是这样,对我来说,这听起来像是框架中的一个bug。不,就是这样。有什么解决办法吗?答案很奇怪,但看看这是否有帮助,因为你说它只是QA环境@戈麦斯表示感谢,但这篇文章似乎在解决一个可重复的错误。我的错误不是每次都发生,所以我不认为这是一个数据库值错误。DI与此无关-框架发现并实例化您的控制器。尝试移动构造函数中的所有类初始化逻辑(您有一些成员初始化),然后使用Try/catch并记录所有错误-这可能是特定于环境的错误。此答案允许我捕获真正的错误,即userClaims.Identity中的声明已消失。由于会话超时,它们已被清除。