当服务于几十个类似的DTO时,ServiceStack“请求未找到处理程序”

时间:2014-05-12 05:14:39

标签: servicestack

我几个月来一直在使用ServiceStack。它已经运行了一段时间,我使用了许多先进的方法和Redis集成。我有许可证,所以我的问题不在于许可证问题,但我想知道它是否相关。它几乎看起来我已经达到了最大的DTO或路径,但我没有得到任何这样的错误,只是“找不到请求处理程序”。所以这是我的问题:如何调试和隔离此错误?我已经阅读了我在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格式= JSON“

1 个答案:

答案 0 :(得分:3)

路由:

您不应该使用.Add<T>方法以及在DTO上使用[Route("/route", "METHOD")]在AppHost中定义路线。

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

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

错字:

您的路线代码中有拼写错误。您的括号(不正确而不是{

(Permissions}

应该是:

{Permissions}

元数据

通过检查应用程序元数据功能,正确定义检查服务的绝佳位置。默认情况下启用此功能,因此您可以通过将/metadata添加到服务器网址来执行此操作。即。

http://localhost:{port}/metadata

Meta data

您可以看到example metadata page here

希望有所帮助。