路径路径中的ServiceStack周期导致404错误

Lit*_*ait 7 servicestack

我有一条路线:

[Route("/usergroup/{User}/{Group}", "GET")]
Run Code Online (Sandbox Code Playgroud)

问题是当{User}中存在特殊字符(例如句点)时,路径未正确评估.如果我手动测试请求,应如何编码?

/usergroup/joe.smith/group1  of course doesn't work

/usergroup/joe%2Esmith/group1  doesn't work either
Run Code Online (Sandbox Code Playgroud)

这里的诀窍是什么?

(更新)这似乎只发生在某些特殊字符上.我可以使用%2D( - )但我不能使用%2E(.).

(更新2)这似乎比那更险恶.这似乎只发生在Visual Studio启动的ASP.Net Development服务器上.

(更新3)这使调试很痛苦.基本上,路径路径不能包含句点,或者我得到"Handler for Request not found"404.

实际上,ServiceStackHttpHandlerFactory(3.9.59)似乎抛出了未找到的错误.

Rau*_*ess 5

我很确定这是一个Visual Studio开发服务器不像"真正的"IIS那样的情况.我自己测试了一下:

  • VS 2012,创建了新的空ASP.NET项目
  • 使用NuGet导入ServiceStack 3.9.59.0的Starter Template
  • 根据您的情况创建了服务和DTO
  • 按F5 - 在localhost上运行
  • /usergroup/joe.schmoe/mygroup/ - 这适用于IISExpress - 找到路由并正确返回输出
  • 切换到使用"Visual Studio开发服务器"
  • F5,再次运行/usergroup/joe.schmoe/mygroup/
  • 路线失败 - "未找到请求处理程序:"

如果编辑项目Web属性并选中"使用IIS Express"而不是"Visual Studio Development Server",则问题将消失.

这里解释了使用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; }
}
Run Code Online (Sandbox Code Playgroud)

更新:我找到了参考ee941656良好链接

如果在Visual Studio 2010中创建文件系统网站,并且该网站位于文件夹名称中包含点(.)的文件夹中,则URL路由将无法可靠地运行.从某些虚拟路径返回HTTP 404错误.发生这种情况是因为Visual Studio 2010使用根虚拟目录的错误路径启动Visual Studio开发服务器(Cassini).

有3个解决方法,只有"使用IIS而不是Cassini"解决方法似乎有效.