控制器作为图像处理程序,如何传递路径

本文关键字:何传递 路径 程序 图像处理 控制器 | 更新日期: 2023-09-27 18:03:37

我试图使用控制器作为图像处理程序,但我如何在路径传递给它?

现在看起来像这样(适用于没有路径的图像):

public void GetImage(string parameter)
{
    var imageHandler = UnityGlobalContainer.Container.Resolve<IImageHandler>();
    imageHandler.ProcessRequest(parameter);
}

但是如果我尝试发送路径folder1'folder2'folder3'picture.jpg,那么它就失败了。

@Html.ActionLink("Show", "GetImage", "Utility", new { parameter = @"folder1'folder2'folder3'picture.jpg" }, new { })

生产:http://localhost: 58359/工具/GetImage/folder1 % 5 cfolder2 % 5 cfolder3 % 5 cpicture.jpg

,这导致:HTTP错误400 -错误请求。

我怎么能在路径传递到控制器使用正常的mvc方法?(我使用的是反斜杠而不是正斜杠)我还使用HttpUtility进行了测试。

控制器作为图像处理程序,如何传递路径

根据你的代码:在html页面中产生的链接应该是:http://localhost:58359/Utility/GetImage?parameter=folder1%5Cfolder2%5Cfolder3%5Cpicture.jpg并且在action方法中参数变量应该正确设置为"folder1'folder2'folder3'picture.jpg"

在。net 4.0 beta 2中,CLR团队提供了一个解决方案。

将此添加到您的web。配置文件:

<uri> 
    <schemeSettings>
        <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" />
    </schemeSettings>
</uri>

这会导致Uri类根据描述Uri的RFC行为,允许在路径中转义斜杠而不进行未转义。CLR团队报告说,由于安全原因,他们偏离了规范,在.config文件中设置这一点基本上使您承担了不转义斜杠所涉及的额外安全考虑。

你不能直接解码这个参数吗?

http://msdn.microsoft.com/en-us/library/6196h3wt.aspx

不要将文件名参数命名为'parameter',并在路由中定义它,而是将其命名为'filename',并且不要在路由中定义它。

您的操作代码将是相同的,但文件名将不再是路由的一部分,而只是一个普通的URL参数。

如果你因为不喜欢URL参数而被这一季的流行所困扰,那么你可能会觉得这很讨厌,但这只是流行,可以安全地忽略。

就我个人而言,我不会将这样的路径传递到web应用程序中,因为我绝对偏执于错误地创建遍历威胁-我只传递无路径的文件名,根据列表验证它们,然后获取文件。