2012-04-18 10 views
8

Sto tentando di utilizzare HttpSelfHostServer per ospitare autonomamente un WebAPI ASP.NET MVC 4. Va tutto bene, provo ad aggiungere un resolver di dipendenze personalizzato. (In definitiva questo utilizzerà StructureMap, ma non ho ancora raggiunto quel punto). Se cerco di istanziare un resolver personalizzato, ottengo la seguente eccezione quando si lancia il server:"Regole di protezione dell'eredità violate" durante l'utilizzo di HttpSelfHostServer e IDependencyResolver

TypeLoadException: le regole di protezione di eredità violate per tipo: 'System.Web.Mvc.CompareAttribute'. I tipi derivati ​​devono corrispondere all'accessibilità di sicurezza del tipo di base o essere meno accessibili.

Il codice è il seguente:

public class CustomDependencyResolver : IDependencyResolver 
{ 
    public object GetService(Type serviceType) 
    { 
     return null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return null; 
    } 
} 

... 

// To trigger the exception, all I need to do is instantiate the custom resolver. 
var dependencyResolver = new CustomDependencyResolver(); 

// Exception is thrown when I create the server: 
var server = new HttpSelfHostServer(_config); 

Si noti che non ho a che fare nulla con il resolver - è simp, y l'atto di istanziare esso che fa scattare il fallimento in seguito.

Stranamente, questa eccezione si verifica solo in debug (F5) - se eseguo tramite Ctrl + F5, tutto funziona correttamente.

Qualche idea su come risolvere questo problema?

Stacktrace:

mscorlib.dll!System.Reflection.RuntimeAssembly.GetExportedTypes() + 0x27 bytes 
System.Web.Http.dll!System.Web.Http.Dispatcher.HttpControllerTypeCacheUtil.FilterTypesInAssemblies(System.Web.Http.Dispatcher.IBuildManager buildManager, System.Predicate<System.Type> predicate) + 0x104 bytes  
System.Web.Http.dll!System.Web.Http.Dispatcher.HttpControllerTypeCacheUtil.GetFilteredTypesFromAssemblies(string cacheName, System.Predicate<System.Type> predicate, System.Web.Http.Dispatcher.IBuildManager buildManager) + 0x76 bytes  
System.Web.Http.dll!System.Web.Http.Dispatcher.HttpControllerTypeCache.InitializeCache() + 0x58 bytes 
System.Web.Http.dll!System.Web.Http.Dispatcher.HttpControllerTypeCache.HttpControllerTypeCache(System.Web.Http.HttpConfiguration configuration) + 0x96 bytes  
System.Web.Http.dll!System.Web.Http.Dispatcher.DefaultHttpControllerFactory.DefaultHttpControllerFactory(System.Web.Http.HttpConfiguration configuration) + 0x96 bytes 
System.Web.Http.dll!System.Web.Http.Services.DefaultServiceResolver..ctor.AnonymousMethod__0(System.Web.Http.HttpConfiguration config) + 0x30 bytes 
System.Web.Http.dll!System.Web.Http.Services.DefaultServiceResolver.GetService(System.Type t) + 0x57 bytes 
System.Web.Http.dll!System.Web.Http.Services.DependencyResolver.GetService(System.Type serviceType) + 0xd3 bytes  
System.Web.Http.dll!System.Web.Http.DependencyResolverExtensions.GetService<System.Web.Http.Dispatcher.IHttpControllerFactory>(System.Web.Http.Services.DependencyResolver resolver) + 0x6a bytes 
System.Web.Http.dll!System.Web.Http.DependencyResolverExtensions.GetServiceOrThrow<System.Web.Http.Dispatcher.IHttpControllerFactory>(System.Web.Http.Services.DependencyResolver resolver) + 0x5b bytes  
System.Web.Http.dll!System.Web.Http.DependencyResolverExtensions.GetHttpControllerFactory(System.Web.Http.Services.DependencyResolver resolver) + 0x25 bytes  
System.Web.Http.dll!System.Web.Http.Dispatcher.HttpControllerDispatcher.HttpControllerDispatcher(System.Web.Http.HttpConfiguration configuration) + 0x77 bytes 
System.Web.Http.SelfHost.dll!System.Web.Http.SelfHost.HttpSelfHostServer.HttpSelfHostServer(System.Web.Http.SelfHost.HttpSelfHostConfiguration configuration) + 0x62 bytes 
WebApi.Host.dll!My.WebApi.Host.Server.Listen() Line 33 + 0x1b bytes C# 
Services.TrialBalance.TestHarness.exe!Digita.AccountsPro.Services.TrialBalance.TestHarness.Program.Main() Line 21 + 0xa bytes C# 
[Native to Managed Transition] 
[Managed to Native Transition] 
mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile, System.Security.Policy.Evidence assemblySecurity, string[] args) + 0x6d bytes  
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() + 0x2a bytes 
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x63 bytes 
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool ignoreSyncCtx) + 0xb0 bytes  
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x2c bytes  
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes 
[Native to Managed Transition] 
+0

Qual è la traccia dello stack? Aggiornamento – SLaks

+0

: Non ho nemmeno bisogno di creare un resolver di dipendenze personalizzato, semplicemente facendo 'var type = typeof (IDependencyResolver);' attiva questo errore. – stusmith

risposta

5

finalmente trovato la risposta; quindi rispondendo alla mia stessa domanda.

Risulta che ci sono due IDependencyResolver: uno in System.Web.Http.Services e uno in System.Web.Mvc.

Entrambi compilano ed eseguono in modalità non di debug.

System.Web.Http.Services.IDependencyResolverè quello corretto.

System.Web.Mvc.IDependencyResolver sembra causare problemi.

+0

Anche questa è stata una grande sorpresa :) –

+0

+1. Benvenuti nei mondi paralleli :) – Aliostad

+1

Sto affrontando questo problema quando provo a utilizzare HttpSelfHostServer. Sembra lo stesso id IDIDencyResolver utilizzato dalla classe HttpConfiguration. Ma non sto creando il mio DependencyResolver personalizzato. Qualche idea? –

Problemi correlati