2016-03-28 16 views
2

" Bağımlılık enjeksiyonunun yanlış kullanımının hataya neden olabileceği konusunda birçok yanıt gördüm.Bağımlılık enjeksiyonu kullanmıyorum, ancak "Bir denetleyici oluşturmaya çalışırken bir hata oluştu" türü "

'FranchiseUserController' türünde bir denetleyici oluşturmaya çalışırken bir hata oluştu. Denetleyicinin parametresiz bir kamu kurucusuna sahip olduğundan emin olun.

ama Ayrıca, bu hata benim yerel geliştirme ortamında olmaz vb Ninject, Unity gibi herhangi bağımlılık enjeksiyon ürünleri kullanarak değilim, ama bizim QA sunucuda sınarken kendini göstermesidir. Ayrıca, aralıklı olarak oluşur ve Web API yöntemlerimin birçoğunda gerçekleşir. Birden çok kullanıcı ve birden çok tarayıcı ile gerçekleşir.

Burada hangi kodun gönderileceğinden emin değilim. Daha fazla bilgiye ihtiyacın olursa haber ver ve onu göndermekten memnuniyet duyarım.

Bu AngularJS kullanarak bir ASP.NET MVC/WebAPI uygulamasıdır. Web API denetleyicisini Angular istemcisinden çağırırken hata oluşur. açısal uygulama ... olan bir 500 iç sunucu hatası ile

Veri durum mesajı hata geri arama cevap alma edilir: tipte bir denetleyicisi oluşturmak için çalışılırken bir hata oluştu 'FranchiseUserController'. Denetleyicinin parametresiz bir kamu kurucusuna sahip olduğundan emin olun. Veri durum türü: iletisi Burada

hata belirtilen kontrol cihazı ve çağrılan yönteminden kurucudur.

yapıcı

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; 
     } 
    } 
} 

... ve yöntem

[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; 
    } 
    //}); 
} 
+0

Bu sınıfta başka kurucu yok mu? Eğer öyleyse, bana göre bir hata gibi geliyor. – mason

+0

Hayır, bu kadar. Herhangi bir geçici çözüm var mı? –

+0

Cevap garip ama bunun sadece QA ortamı olduğunu söylediğinden beri yardımcı olup olmadığına bakın. http://forums.asp.net/t/2027017.aspx?Web+API+2+0+An+error+occurred+when+trying+to+create+a+controller+of+type+ – Gomes

cevap

2

Büyük olasılıkla, bir şekilde HttpControllerContext erişir Denetleyiciniz kurucusundaki kodu var. Denetleyici oluşturulmadan önce HttpControllerContext'un hazır olmadığı durumlarda (belki de uygulama havuzu yeniden başlatıldığında) koşuyor olabilirsiniz.

Uygulamanın kullanım ömrü boyunca herhangi bir noktada oluşturulabildiğinden, keep your controller constructors simple en iyisidir. Eğer DI kullanıyor olsaydınız, karmaşık mantığınızı bir servise götürmenizi öneririm ve atama servislerinin dışında kurucularda hiçbir şey yapmazsınız. Ancak, DI kullanmıyorsanız, mantığınızı denetleyicinizin Initialize olayına taşıyarak ve kurucuyu tamamen kaldırarak bu sorunu çözebilirsiniz.

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; 
     } 
    } 
} 

NOT: Bu uygulamanızda neler olduğunu olduğunu kesin olarak söyleyemeyiz, ancak hep bir kontrolör örneği anda geçerli bir HTTP Bağlam yoktur üstlenmelidir.

Bir yan notta, bu mantık kesişen bir sorun gibi görünüyor. Her denetleyicide yinelemeyen bir filter içinde yapmalısınız.

+0

Bu cevap, userClaims.Identity'deki hak taleplerinin giderildiğini gösteren gerçek hatayı yakalamamı sağladı. Bir oturum zaman aşımı nedeniyle temizlenmişlerdi. –