如果字符串参数以文件扩展名结束,请求会话对象为空
本文关键字:会话 请求 对象 结束 参数 字符串 文件 扩展名 如果 | 更新日期: 2023-09-27 18:15:00
我有一个用户可以下载文件的操作。URL如下所示:
http://mywebsite.lan/report/GetReport/reportname.xlsx
为了让服务器处理类似文件名的参数,我必须在我的web.config
中添加这个:
<system.webServer>
<modules>
<remove name="UrlRoutingModule-4.0" />
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" />
</modules>
</system.webServer>
操作本身工作得很好,用户调用URL,服务器返回文件in参数。
我在控制器上有一个授权过滤器,该过滤器处理此请求,该请求处理所有身份验证检查和授权加载过程,并在检查特定权限的操作上有一个操作过滤器。这两个过滤器都使用Session对象来存储用户信息和权限。
问题是,当使用此url时,会话对象在动作过滤器中为空,使它们在试图访问其上的创建键时崩溃。然而,会话对象存在于动作本身中。
经过一些跟踪,我发现通过添加一个尾/到url,会话对象又回来了:
http://mywebsite.lan/report/GetReport/reportname.xlsx/
我似乎找不到这个问题的根本原因。
还有人遇到过这个问题吗?
我通过在我的web.config
中添加以下行来解决类似的问题 <modules>
<remove name="Session"/>
<add name="Session" type="System.Web.SessionState.SessionStateModule, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</modules>
我认为默认情况下,Session模块配置了"managedHandler"前置条件。
<add name="Session" type="System.Web.SessionState.SessionStateModule" preCondition="managedHandler" />
和默认情况下。xlst不与托管处理程序相关联,并且Session模块不会为。xslt运行。
当你在URL末尾添加"/"时,我认为"默认文档"逻辑在某个地方触发,默认文档可能是默认的。它会打开Session模块。这是一个纯粹的猜测,我没有验证。
或者你也可以将.xslt与IIS ->处理程序映射中的托管处理程序(System.Web.UI.PageHandlerFactory)关联。这应该是更好的,因为我不喜欢它如何会话模块现在触发在我们的网站上的每个请求,但我没有尝试它,因为在我们的情况下,没有定义的扩展相关联。