我的路线如下:
[Route("/usergroup/{User}/{Group}", "GET")]
问题是当{User}中存在特殊字符(例如句点)时,路径未正确评估。如果我手动测试请求,应如何编码?
/usergroup/joe.smith/group1 of course doesn't work
/usergroup/joe%2Esmith/group1 doesn't work either
这里的诀窍是什么?
(更新)这似乎只发生在某些特殊字符上。我可以使用%2D( - )但我不能使用%2E(。)。
(更新2)这似乎比那更险恶。这似乎只发生在Visual Studio启动的ASP.Net Development服务器上。
(更新3)这使调试很痛苦。基本上路由路径不能包含句点,或者我得到“Handler for Request not found”404。
实际上似乎 ServiceStackHttpHandlerFactory (3.9.59)抛出了未找到的错误。
答案 0 :(得分:5)
我很确定这是一个Visual Studio开发服务器不像'真正的'IIS那样的情况。我自己测试过这个:
如果编辑项目Web属性并选中“使用IIS Express”而不是“Visual Studio Development Server”,问题就会消失。
使用IIS Express的案例是explained here
我还发现another SO answer which is a similar case. 幸运的是,那里的答案包含一个错误的链接引用,但引用了实际的文本。
这是我使用的代码:
public class UserGroupService : Service
{
public object Any(UserGroupRequest request)
{
return new UserGroup { User = "Got: " + request.User, Group = "Got: " + request.Group, };
}
}
[Route("/usergroup/{User}/{Group}", "GET")]
public class UserGroupRequest
{
public string User { get; set; }
public string Group { get; set; }
}
public class UserGroup
{
public string User { get; set; }
public string Group { get; set; }
}
更新:我找到了good link to the reference ee941656
如果在Visual Studio 2010中创建文件系统网站,并且网站位于文件夹名称中包含点(。)的文件夹中,则URL路由将无法可靠地运行。从某些虚拟路径返回HTTP 404错误。发生这种情况是因为Visual Studio 2010使用根虚拟目录的错误路径启动Visual Studio开发服务器(Cassini)。
有3个解决方法,只有“使用IIS而不是Cassini”解决方法似乎有效。