我有一个操作,我的用户可以通过该操作下载文件。网址如下所示:
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/