Nancy框架URL路径无法识别句号,文件名后缀丢失问题求助
解决Nancy路由中文件名后缀丢失的问题
我之前也踩过Nancy这个路由匹配的坑!你遇到的问题是因为Nancy默认会把路径里的句号(.)当成路由分段的分隔符,所以{fileName}参数只会捕获到句号前面的部分,直接导致后缀丢失了。
快速修复:给路由参数添加正则约束
你只需要修改路由定义,给fileName参数加上正则约束,明确告诉Nancy要捕获包含句号的完整文件名:
Get["/{company_id}/storage/{fileName:.*}"] = x => { return ReadFileFromStorage(x.company_id, x.fileName); };
这里的:.*是正则表达式,意思是匹配任意字符(包括句号),这样Nancy就会把/storage/之后的所有内容都赋值给fileName参数,不管里面有多少个句号。
如果想要更严谨一点(比如避免意外捕获到斜杠,虽然你的场景里不会出现这种情况),也可以用[^/]+作为约束——它匹配除了斜杠之外的所有字符,同样能完整包含带后缀的文件名:
Get["/{company_id}/storage/{fileName:[^/]+}"] = x => { return ReadFileFromStorage(x.company_id, x.fileName); };
验证效果
修改路由后再访问http://localhost/MOCK/storage/foo.xml,你会发现:
x.fileName的值变成了完整的"foo.xml"this.Request.Path也会正确显示为"/MOCK/storage/foo.xml"- 完全不需要对句号做URL转义(比如
%2Exml),正常格式的URL就能被正确解析。
内容的提问来源于stack exchange,提问作者Daniel Williams
相关产品推荐
相关产品推荐

