none
关于HttpModule的PreSendRequestHeaders事件的触发机制 RRS feed

  • 问题

  • 公司项目之前使用isapi + iis拦截和处理HTTP请求,处理过程和结果基本正常。和客户业务需求一致。
    之后因为技术原因电话咨询微软技术支持,不推荐使用isapi,推荐使用HTTPMODULE + IIS,现有如下两个问题发生。
    
    第一,
    使用HTTPMODULE的PreSendRequestHeaders事件,请求过程和结果基本和isapi一致,不过在与IIS和JBOSS,WEBLOGIC的集成处理时
    在IIS中配置好集成插件后,JBOSS,WEBLOGIC端又无法取得在PreSendRequestHeaders事件中设定的header情报。(是否有解决策?)
    因此尝试改用了PreRequestHandlerExecute事件。不过在使用HTTPMODULE的PreRequestHandlerExecute事件,处理末尾不是"/"的URL时,
    经调试发现,在这个事件内会自动的进行多次请求(通常3次),直到找到默认页为止。这个处理过程和结果影响到客户的业务运用。
    
    而isapi的OnPreprocHeaders事件和HTTPMODULE的PreSendRequestHeaders事件 ,只对原始访问URL进行一次请求。
    
    第二
    IIS中搭建同一站点多个application的结构中,不能只在站点上导入自定义的httpmodule后,同时适用到站点下的多个application 。isapi的配置就可以只在站点层配置,然后适用到站点下的多个application。
     如果 application层也挂上自定义的httpmodule或者继承站点层的自定义的httpmodule ,因为站点层也存在自定义的httpmodule,是否也会出现多次进行自定义的httpmodule处理的冲突情况?   
    
    对于以上两个问题,希望麻烦帮忙提供解决策!谢谢。 

    
    2019年1月21日 9:40

全部回复

  • 你好,

    据我所知,IIS有Global Modules属性,可以注册全局modules。

    使用这个属性,我们就可以注册所有站点的modules。

    具体如何使用这个属性,你可以参照如下链接:

    https://www.cnblogs.com/chucklu/p/6847237.html 

    英文版:

    https://docs.microsoft.com/zh-cn/iis/configuration/system.webServer/globalModules/ 


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年1月23日 8:56
  • 
    你好,
    根据回答内容判断应该是对于第二个问题的回答
    这个问题经过试验后发现,在某站点设置module后,
    下级aplication是可以继承到的,不影响我们项目的业务运用。
    不过您的回答内容对于以后如遇到类似问题应该会有参考,谢谢回答。
    
    主要还是想问下第一个问题,
    利用httpmodule的PreRequestHandlerExecute这个事件
    请求https://xxx.com/path或者https://xxx.com/path/ 这样的url的时候
    debug的时候发现在事件内部会自动进行多次请求,直到找到path下面的默认页为止结束请求呢?
    
    是否有方案对于上面的url例在PreRequestHandlerExecute这个事件内不会进行多次请求呢?
    
    
    注:使用iis的isapi filter的话,利用isapi的CHttpFilter::OnPreprocHeaders事件就不会多次请求。 

    2019年1月25日 6:12
  • 你好,

    能告诉下时间内部自动进行多次请求的url是什么吗?


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年1月29日 5:57
  • 
    你好
    我用项目开发中实际的测试case举个例吧
     
    在一个普通且简单的html页面点击sso/path/check_path6这样的link
    请求的url地址如下
    https://localhost/sso/path/check_path6
     
    在事件内断点跟踪,发现多次进入事件内部直到找到check_path6目录下的默认页(index.html)后,停止请求。
    请求过程如下:
     
    第一次在事件内部取得的context.Request.Url是https://localhost/sso/path/check_path6
     
    第一次之后,又自动的进入到事件内部。此时取得的context.Request.Url是https://localhost/sso/path/check_path6/ (自动在末尾加了斜杠)
    之后还会再自动进入到事件内部,取得的context.Request.Url仍然是https://localhost/sso/path/check_path6/ (自动在末尾加了斜杠)
     
    最后一次自动进入到事件内部后,取得的context.Request.Url是https://localhost/sso/path/check_path6/index.html (自动在末尾加了默认页)
    然后就结束了此次请求。
     
    运用上,从表面看只请求了一个url,实际上事件内部进行了多次请求并重复执行了事件内部的代码。
    对业务逻辑处理等产生了影响。 
    

    2019年1月31日 4:45