7

我有这样的路线:

[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 开发服务器上。

(更新 3)这使得调试很痛苦。基本上路由路径不能包含句点,或者我得到“未找到请求的处理程序”404。

实际上,似乎ServiceStackHttpHandlerFactory (3.9.59) 正在抛出未找到错误。

4

1 回答 1

5

我相当确定这是 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”的解决方法似乎有效。

于 2013-09-14T03:06:31.263 回答