我几个月来一直在使用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“
答案 0 :(得分:3)
您不应该使用.Add<T>
方法以及在DTO上使用[Route("/route", "METHOD")]
在AppHost中定义路线。
您只需要使用一种方法。所以这可能会导致冲突,当然还有额外的维护。我建议只使用Route
属性的后者。因此,从DTO路由覆盖的AppHost中移除Add
规则。
您还应该阅读routing documentation here和this post about routing。
您的路线代码中有拼写错误。您的括号(
不正确而不是{
:
(Permissions}
应该是:
{Permissions}
通过检查应用程序元数据功能,正确定义检查服务的绝佳位置。默认情况下启用此功能,因此您可以通过将/metadata
添加到服务器网址来执行此操作。即。
http://localhost:{port}/metadata
您可以看到example metadata page here
希望有所帮助。