Skip to main content
 首页 » 编程设计

c#之枚举反射程序集中的集合需要空引用检查吗

2024年01月12日29落叶无声

我在 C#/.NET 3.5 中遇到了一个非常奇怪的行为...

我正在编写一个连接到内容管理系统上传管道的类。 CMS 通过反射执行此 Hook 。

由于某些未知原因,以下代码因抛出 NullRef("file"是一个 HttpFileCollection)而失败。

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

在语句使循环成功之前添加 NullRef 检查之后。两种情况下上传的文件都是相同的。 return 语句永远不会执行,因为 null 条件失败。

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

我完全被这个难住了。有什么想法吗?

完整堆栈跟踪

    ** 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 

请您参考如下方法:

只是猜测,但 CMS 中可能存在一些意外行为(可能是错误)。无论是否有错误,您与 CMS 的契约(Contract)都没有完全定义。

上传文件匹配的原因是因为您的方法可能被多次调用,最后一次调用引发异常。

鉴于您正在使用不受您控制的应用程序,您的解决方案是正确的——您必须在使用之前检查您提供的所有内容。