我相当确定这是 Visual Studio Development Server 不像“真正的”IIS 的情况。我自己测试了这个:
- VS 2012,创建新的空 ASP.NET 项目
- 使用 NuGet 为 ServiceStack 3.9.59.0 导入 Starter Template
- 根据您的案例创建了服务和 DTO
- 按 F5 - 在本地主机上运行
- /usergroup/joe.schmoe/mygroup/ - 这适用于 IISExpress - 找到路由并正确返回输出
- 切换到使用“Visual Studio 开发服务器”
- F5,再次运行 /usergroup/joe.schmoe/mygroup/
- 路由失败 - “未找到请求的处理程序:”
如果您编辑项目 Web 属性并选中“使用 IIS Express”而不是“Visual Studio 开发服务器”,问题就会消失。
这里解释了使用 IIS Express 的案例
我还发现了另一个类似情况的 SO 答案。
幸运的是,那里的答案包含错误的链接参考,但引用了实际文本。
这是我使用的代码:
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; }
}
更新:我找到了参考 ee941656 的一个很好的链接
如果您在 Visual Studio 2010 中创建文件系统网站,并且该网站位于文件夹名称中包含点 (.) 的文件夹中,则 URL 路由将无法可靠地工作。从某些虚拟路径返回 HTTP 404 错误。发生这种情况是因为 Visual Studio 2010 使用错误的根虚拟目录路径启动 Visual Studio 开发服务器 (Cassini)。
有 3 种解决方法,只有“使用 IIS 而不是 Cassini”的解决方法似乎有效。