2

Je suis dans un comportement très étrange en C# /. NET 3.5 ...Vérification de référence nulle requise pour énumérer une collection dans un assemblage réfléchi?

J'écris une classe qui se connecte au pipeline de téléchargement d'un système de gestion de contenu. Le CMS exécute ce hook par réflexion.

Pour une raison inconnue, le code suivant échoue en lançant un NullRef ("Files" est un HttpFileCollection).

foreach (var fileKey in args.Files.AllKeys) 
{ 
    // Do Stuff 
} 

Après avoir ajouté un chèque de NullRef avant l'instruction fait réussir la boucle . Les fichiers téléchargés sont identiques dans les deux cas. L'instruction return n'est jamais exécutée, car la condition null échoue.

if (args.Files == null) return; 
foreach (var fileKey in args.Files.AllKeys) 
{ 
    // Do Stuff 
} 

Je suis totalement déconcerté par cela. Des idées?

pleine Stack Trace

** Exception: System.Web.HttpUnhandledException ** 
    Message: Exception of type 'System.Web.HttpUnhandledException' was thrown. 
    Source: System.Web 
    at System.Web.UI.Page.HandleError(Exception e) 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
    at System.Web.UI.Page.ProcessRequest() 
    at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) 
    at System.Web.UI.Page.ProcessRequest(HttpContext context) 
    at ASP.sitecore_shell_applications_flashupload_advanced_uploadtarget_aspx.ProcessRequest(HttpContext context) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

    ** Nested Exception ** 
    Exception: System.Reflection.TargetInvocationException 
    Message: Exception has been thrown by the target of an invocation. 
    Source: mscorlib 
    at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes,  RuntimeTypeHandle typeOwner) 
    at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes,  RuntimeTypeHandle typeOwner) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
    at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) 
    at Sitecore.Reflection.ReflectionUtil.InvokeMethod(MethodInfo method, Object[] parameters, Object obj) 
    at Sitecore.Pipelines.Processor.Invoke(PipelineArgs args) 
    at Sitecore.Nexus.Pipelines.NexusPipelineApi.Resume(PipelineArgs args, Pipeline pipeline) 
    at Sitecore.Pipelines.Pipeline.Resume() 
    at Sitecore.Pipelines.Pipeline.DoStart(PipelineArgs args) 
    at Sitecore.Pipelines.Pipeline.Start(PipelineArgs args, Boolean atomic) 
    at Sitecore.Pipelines.Pipeline.Start(PipelineArgs args) 
    at Sitecore.Shell.Applications.FlashUpload.Advanced.UploadTarget.HandleUpload() 
    at Sitecore.Shell.Applications.FlashUpload.Advanced.UploadTarget.OnLoad(EventArgs e) 
    at System.Web.UI.Control.LoadRecursive() 
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 

    ** Nested Exception ** 
    Exception: System.NullReferenceException 
    Message: Object reference not set to an instance of an object. 
    Source: Sitecore.CustomExtensions 
    at Sitecore.CustomExtensions.StreamingMediaUploader.Process(UploadArgs args) in C:\...\Sitecore.CustomExtensions\StreamingMediaUploader.cs:line 33 
+0

Pouvez-vous fournir la trace de la pile complète de l'exception? – qbeuek

+0

Votre vérification NullRef avant l'instruction fait à peine la boucle réussir, non? Cela vous fait revenir de la méthode ... –

+0

Donc, après le contrôle, il n'est pas toujours NULL et il ne revient jamais, c'est-à-dire que cette vérification supplémentaire en fait toujours une valeur? – Aliostad

Répondre

0

Juste une supposition, mais il y a probablement un comportement inattendu (peut-être un bug) dans le CMS. Bug ou pas, votre contrat avec le CMS n'est pas entièrement défini.

La raison pour laquelle les fichiers importés correspondent est parce que votre méthode a probablement été appelée plusieurs fois avec l'appel final soulevant l'exception. Étant donné que vous travaillez avec une application que vous ne contrôlez pas, votre solution est correcte - vous devez vérifier tout ce que vous avez reçu avant de l'utiliser.

+0

Je suis sceptique à ce sujet, car args est juste une enveloppe autour de HttpFileCollection, qui est un générique .NET construit. Je ne suis pas entièrement convaincu par l'exception que cela est dû à CMS –

+0

@Greg R: Vous devriez mettre un peu de connexion pour chaque fois que votre méthode est appelée. Je parie que c'est plus d'une fois (avec le dernier exigeant le contrôle nul). –

+0

J'ai un ensemble de points d'arrêt et j'attache un débogueur, il est appelé qu'une seule fois –

Questions connexes