c# - 如果字符串参数以文件扩展名结尾,则请求 session 对象为空

标签 c# .net asp.net-mvc session action-filter

我有一个操作,我的用户可以通过该操作下载文件。网址如下所示:

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,服务器返回参数中的文件。

我在 Controller 上有一个授权过滤器来处理这个请求,它处理我所有的身份验证检查和授权加载过程,还有一个在 Action 上检查特定权限的 Action 过滤器。这两个过滤器都使用 Session 对象来存储用户信息和权限。

问题是,当使用这个 url 时,操作过滤器中的 session 对象为 null,这使得它们在尝试访问其上的创建键时崩溃。尽管如此, session 对象存在于操作本身中。

经过一些跟踪,我发现通过在 url 中添加尾部/, session 对象又回来了:

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 末尾添加“/”时,我认为“默认文档”逻辑会在某处触发,默认文档可能是 Default.aspx 或类似的文件,它会打开 session 模块。纯属猜测,本人未核实。

或者您也可以将 .xslt 与 IIS -> 处理程序映射中的托管处理程序 (System.Web.UI.PageHandlerFactory) 相关联。这可能会更好,因为我不喜欢 Session 模块现在如何针对我们网站上的每个请求触发,但我没有尝试它,因为在我们的例子中没有定义的扩展与之关联。

关于c# - 如果字符串参数以文件扩展名结尾,则请求 session 对象为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32818250/

相关文章:

c# - 需要使用 LINQ 从多维数组中求和

c# - 通过另一个库共享引用类库中的 C# 类

c# - 顺序等待 VS 连续等待

c# - 在 MVC 2 中,如何使用 C# 确定服务器上是否存在文件?

javascript - 防止多次单击按钮的 jQuery 不起作用

c# - 动态创建 <Type> 的对象

c# - 使用离线 mySQL 数据库在 Unity for android 中制作游戏

使用表达式的泛型类的 C# 加速方法调用

.net - 如何用 IoC 容器组织 MVP?

asp.net-mvc - 如何在 cshtml 中停止 ASP.NET MVC View 渲染?