Como posso usar a afirmação do JScript para filtrar os tipos de exceção no Elmah 1.1 RC?
-
06-09-2019 - |
Pergunta
A primeira ligação contra o 404 funciona, então eu resolvi o ErrorFilTermodule corretamente, mas a seção JScript não parece funcionar. HttPrequestValidationException ainda está sendo enviado no correio do relatório.
<errorFilter>
<test>
<equal binding="HttpStatusCode" value="404" type="Int32" />
<jscript>
<![CDATA[
// @assembly mscorlib
// @assembly System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// @import System.IO
// @import System.Web
HttpStatusCode == 404
|| BaseException instanceof FileNotFoundException
|| BaseException instanceof HttpRequestValidationException
|| BaseException instanceof HttpException
/* Using RegExp below (see http://msdn.microsoft.com/en-us/library/h6e2eb7w.aspx) */
|| Context.Request.UserAgent.match(/crawler/i)
|| Context.Request.ServerVariables['REMOTE_ADDR'] == '127.0.0.1' // IPv4 only
]]>
</jscript>
</test>
</errorFilter>
Solução
Quando você tem mais de uma condição, a maneira como você o tem no seu exemplo (<equal>
então <jscript>
), você precisa dizer a Elmah para qualquer um ou eles ou ou eles. A solução é usar <and>
ou <or>
, dependendo de como você deseja combinar logicamente as condições. Abaixo, eu tenho o OR-ED os dois para que a condição possa se aplicar:
<errorFilter>
<test>
<or>
<equal binding="HttpStatusCode" value="404" type="Int32" />
<jscript>
<expression><![CDATA[
// @assembly mscorlib
// @assembly System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// @import System.IO
// @import System.Web
HttpStatusCode == 404
|| BaseException instanceof FileNotFoundException
|| BaseException instanceof HttpRequestValidationException
|| BaseException instanceof HttpException
/* Using RegExp below (see http://msdn.microsoft.com/en-us/library/h6e2eb7w.aspx) */
|| Context.Request.UserAgent.match(/crawler/i)
|| Context.Request.ServerVariables['REMOTE_ADDR'] == '127.0.0.1' // IPv4 only
]]></expression>
</jscript>
</or>
</test>
</errorFilter>
Quando você tem várias condições diretamente sob <test>
sem lógico (<and>
ou <or>
) combinação então apenas a primeira é usada, e é por isso que seu <jscript>
um estava sendo negligenciado.