我正在使用Elmah记录我的网站的异常,一切似乎一切正常,直到有一天我注意到500服务器错误未被正确捕获。我正在使用以下脚本来专门忽略ScriptResource.axd文件中的错误。
<errorFilter>
<test>
<or>
<and>
<regex binding="FilterSourceType.Name" pattern="mail" />
<jscript>
<expression>
<![CDATA[
// @assembly mscorlib
// @assembly System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// @import System.IO
// @import System.Web
(Context.Request.ServerVariables["URL"].match(/ScriptResource\.axd/i) && BaseException instanceof System.FormatException)
]]>
</expression>
</jscript>
</and>
</or>
</test>
触发第一个错误时似乎工作正常。但是,下次触发此错误时,Elmah会停止过滤并无法发送电子邮件。我能够在本地重现这个问题,这是问题的根源:
Microsoft.JScript.JScriptException: Object reference not set to an instance of an object. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at System.Web.HttpServerVarsCollection.Get(String name)
at invoker2.Invoke(Object , Object[] )
at Microsoft.JScript.JSMethodInfo.Invoke(Object obj, BindingFlags options, Binder binder, Object[] parameters, CultureInfo culture)
at Microsoft.JScript.LateBinding.CallOneOfTheMembers(MemberInfo[] members, Object[] arguments, Boolean construct, Object thisob, Binder binder, CultureInfo culture, String[] namedParameters, VsaEngine engine, Boolean& memberCalled)
at Microsoft.JScript.LateBinding.Call(Binder binder, Object[] arguments, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters, Boolean construct, Boolean brackets, VsaEngine engine)
at Microsoft.JScript.LateBinding.Call(Object[] arguments, Boolean construct, Boolean brackets, VsaEngine engine)
at Microsoft.JScript.Call.Evaluate()
--- End of inner exception stack trace ---
at Microsoft.JScript.Block.Evaluate()
at Microsoft.JScript.FunctionObject.CallASTFunc(Object[] args, Object thisob, ScriptObject enclosing_scope, Closure calleeClosure, Binder binder, CultureInfo culture)
at Microsoft.JScript.FunctionObject.Call(Object[] args, Object thisob, ScriptObject enclosing_scope, Closure calleeClosure, Binder binder, CultureInfo culture)
at Microsoft.JScript.Closure.Call(Object[] args, Object thisob, Binder binder, CultureInfo culture)
at Microsoft.JScript.LateBinding.CallValue(Object val, Object[] arguments, Boolean construct, Boolean brackets, VsaEngine engine, Object thisob, Binder binder, CultureInfo culture, String[] namedParameters)
at Microsoft.JScript.LateBinding.CallValue(Object thisob, Object val, Object[] arguments, Boolean construct, Boolean brackets, VsaEngine engine)
at Elmah.Assertions.JScriptAssertion.FullTrustEvaluationStrategy.Eval(Object context) in C:\workspace\v2_psp\Elmah\src\Elmah\Assertions\JScriptAssertion.cs:line 312
我不明白的是这种情况发生的原因和原因。我还尝试了其他ServerVariables,到目前为止,我发现当第二次发生相同的异常时, HTTPS,HTTP_REFERER 将不会触发此错误。 网址,SCRIPT_NAME,PATH_INFO,PATH_TRANSLATED 将触发此错误。
思想?
答案 0 :(得分:1)
好!在进一步挖掘之后,在使用Elmah的JScriptAssertion时,您似乎无法从ServerVariables [“XXX”]访问任何DynamicServerVariable。但是,我确实找到了一个解决方法,看起来这些DynamicServerVariable在HttpRequest对象上有公共属性映射!!
因此,在我想访问Context.Request.ServerVariables [“URL”]的情况下,我可以用Context.Request.FilePath替换代码,这是“URL”在HttpRequest中的映射方式宾语。这样,当第二次抛出异常时,JScriptAssertion不会抛出异常。
以下是DynamicServerVariable及其在HttpRequest中的属性映射。
ServerVariables HttpRequest Property
URL FilePath
SCRIPT_NAME FilePath (Same as URL)
PATH_INFO Path
PATH_TRANSLATED PhysicalPathInternal
QUERY_STRING QueryStringText
AUTH_TYPE if (_context.User != null && _context.User.Identity.IsAuthenticated) Context.User.Identity.AuthenticationType, otherwise String.empy
AUTH_USER if (_context.User != null && _context.User.Identity.IsAuthenticated) Context.User.Identity.Name, otherwise String.empty
REMOTE_USER if (_context.User != null && _context.User.Identity.IsAuthenticated) Context.User.Identity.Name, otherwise String.empty (Same as AUTH_USER)