【问题标题】:ServiceStack "Handler for request not found" when it is working for dozens of similar DTOs服务堆栈“未找到请求的处理程序”,当它为数十个类似的 DTO 工作时
【发布时间】:2014-05-12 17:05:16
【问题描述】:

我已经使用 ServiceStack 几个月了。它已经运行了一段时间,我使用了许多高级方法和 Redis 集成。我有许可证,所以我的问题与许可证问题无关,但我想知道它是否相关。看起来我已经达到了最大 DTO 或路径,但我没有收到任何此类错误,只是“未找到请求的处理程序”。所以这是我的问题:你如何调试和隔离这个错误?我已经阅读了所有我能找到的关于 DTO 和 DTO 过滤器的正确格式的帖子,而且我已经做了足够长的时间,在这方面我看不出有什么问题。相同样式的 DTO 和路径有效,但新的失败,或者看起来如此。即使我发现我在 DTO 设置中做错了什么,问题仍然存在,有没有办法调试它?当然,如果是这样的话,找出我做错了什么是第一个问题。

这是我的代码,首先是 AppHost:

.Add<UsersCredentials>("/userscredentials", "GET")
.Add<UserCredential>("/userscredentials", "DELETE")
.Add<UserCredential>("/userscredentials/{UserName}", "POST PUT DELETE")
.Add<UserCredential("/userscredentials/{UserName}/(Permissions}/{System}/{ParamSet}/{Instrument}/{Interval}", "POST PUT DELETE")

DTO:

[Route("/userscredentials", "GET")]
public class UsersCredentials : IReturn<UsersCredentials>
{
    public string UserName { get; set; }
    public string Permissions { get; set; }
    public string System { get; set; }
    public uint ParamSet { get; set; }
    public string Instrument { get; set; }
    public uint Interval { get; set; }
}    //Request DTO

[Route("/userscredentials", "DELETE")]
[Route("/userscredentials/{UserName}", "POST PUT DELETE")]
[Route("/userscredentials/{UserName}/(Permissions}/{System}/{ParamSet}/{Instrument}/{Interval}", "POST PUT DELETE")]
public class UserCredential : IReturn<UserCredential>
{
    public string UserName { get; set; }
    public string Permissions { get; set; }
    public string System { get; set; }
    public uint ParamSet { get; set; }
    public string Instrument { get; set; }
    public uint Interval { get; set; }
}    //Request DTO

和服务:

// UsersCredentials
public class UsersCredentialsResponse
{
    public string Result { get; set; }
    public ResponseStatus ResponseStatus { get; set; } //Where Exceptions get auto-serialized
}

public class UsersCredentialsService : Service
{
    private bool init = false;


    public object Get(UsersCredentials request)
    {

        return (request);
    }

    public object Post(UserCredential request)
    {

        return request;

    }

    public object Put(UserCredential request)
    {

        return request;

    }

    public void Delete(UserCredential request)
    {
    }
}

我使用“POSTMAN”进行调试并将其作为 POST 发送:

    http://sun:1300/userscredentials/a?format=json

它有效。然后我作为 POST 发送:

    http://sun:1300/userscredentials/a/b/c/1/d/2?format=json

并得到“未找到请求的处理程序:Request.HttpMethod:POST Request.PathInfo:/userscredentials/a/b/c/1/d/2 Request.QueryString:format=json Request.RawUrl:/userscredentials/ a/b/c/1/d/2?format=json"

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    路由:

    您不应该在 AppHost 中使用 .Add&lt;T&gt; 方法以及在 DTO 上使用 [Route("/route", "METHOD")] 来定义路由。

    您只需要使用一种方法。所以这可能会导致冲突,当然还有额外的维护。我建议只使用Route 属性中的后者。因此,请从您的 AppHost 中删除 Add 规则,因为它们已被 DTO 路由覆盖。

    您还应该阅读routing documentation herethis post about routing

    错字:

    您的路线代码中有错字。你有一个不正确的括号 ( 而不是 {

    (Permissions}
    

    应该是:

    {Permissions}
    

    元数据

    检查服务定义是否正确的一个好地方是检查应用程序元数据功能。这是默认启用的,因此您可以通过将 /metadata 添加到您的服务器 url 来执行此操作。即

    http://localhost:{port}/metadata
    

    你可以看到example metadata page here

    希望对您有所帮助。

    【讨论】:

    • 谢谢,成功了!我错过了你不需要把它放在 AppHost 和 DTO 方法中来定义你的路由。我可以发誓它在某一时刻对我不起作用,只在一个地方拥有它,但现在我想我只是在学习路线,而其他一些东西让我失望了。但是那个错字才是真正的杀手(括号错了)。最后,这是一件好事,因为我从未意识到 AppHost 冗余。这也解释了我看到的另一个问题,即同一件事的双重路线。再次感谢,我为此浪费了 10 个小时!
    • 为了清楚“双路线”,我查看了元数据,路线就列在那里。坏支架并不明显,但我有两条通往同一目的地的路线这一事实是显而易见的。我对此感到困惑,但无法调试它。不过,为了别人的缘故,拥有它两次并没有引起冲突,它只是糟糕的支架。我强烈建议 ServiceStack 或帮助他们项目的人考虑针对这种情况使用语法检查器。我知道这是我的错误,但它很容易犯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多