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

时间:2013-09-09 12:15:25

标签: servicestack

我的路线如下:

[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)抛出了未找到的错误。

1 个答案:

答案 0 :(得分:5)

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

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

如果编辑项目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”解决方法似乎有效。