如果字符串参数以文件扩展名结束,请求会话对象为空

本文关键字:会话 请求 对象 结束 参数 字符串 文件 扩展名 如果 | 更新日期: 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)关联。这应该是更好的,因为我不喜欢它如何会话模块现在触发在我们的网站上的每个请求,但我没有尝试它,因为在我们的情况下,没有定义的扩展相关联。