servicestack ServiceStack自动查询,隐式/显式查询
我有以下要求:servicestack ServiceStack自动查询,隐式/显式查询,servicestack,ormlite-servicestack,servicestack,ormlite Servicestack,我有以下要求: [Route("/processresults")] public class FindProcessResults : QueryBase<ProcessResult, ProcessResultDto> {} [Route("/processresults")] public class FindProcessResults : QueryBase<ProcessResult, ProcessResultDto> { public in
[Route("/processresults")]
public class FindProcessResults : QueryBase<ProcessResult, ProcessResultDto> {}
[Route("/processresults")]
public class FindProcessResults : QueryBase<ProcessResult, ProcessResultDto>
{
public int Id { get; set; }
}
这里可能有什么问题
奖励积分,如果我使用表单数据发布帖子,我会得到以下例外情况:
{
ResponseStatus: {
ErrorCode: "RequestBindingException",
Message: "Unable to bind request",
StackTrace: " at ServiceStack.Host.RestHandler.CreateRequest(IRequest httpReq, IRestPath restPath)\ \ at ServiceStack.Host.RestHandler.ProcessRequestAsync(IRequest httpReq, IResponse httpRes, String operationName)"
}
}
但是,如果我使用x-www-form-urlencoded执行相同的操作,则查询将按预期方式工作,并返回单个结果
结论:虽然我可以通过向类型化请求中添加我希望按Id查询的参数来解决此问题,但这违背了我试图实现的目标,即我的数据存储的通用查询机制。该功能已存在于请求的GET版本
我认为这与AutoQueryServiceBase的实现有关:
public virtual object Exec<From>(IQuery<From> dto)
{
SqlExpression<From> q;
using (Profiler.Current.Step("AutoQuery.CreateQuery"))
{
q = AutoQuery.CreateQuery(dto, Request.GetRequestParams());
}
using (Profiler.Current.Step("AutoQuery.Execute"))
{
return AutoQuery.Execute(dto, q);
}
}
回应
您应该强烈考虑使用GET请求来使用自动查询服务,这是更适合使用的HTTP谓词,这也是更可缓存和可自省的。 如果您想发布并且不想使用HTML表单发布,即x-www-Form-urlencoded内容类型,则需要通过将参数添加到请求DTO中来对参数进行形式化:
[Route("/processresults")]
public class FindProcessResults : QueryBase<ProcessResult, ProcessResultDto> {}
[Route("/processresults")]
public class FindProcessResults : QueryBase<ProcessResult, ProcessResultDto>
{
public int Id { get; set; }
}
否则,它将尝试将JSON反序列化为一个空DTO,其中忽略任何不存在的属性。请使用Fiddler或WebInspector之类的工具发布失败查询的完整HTTP请求/响应。感谢您的帮助@mythz我已附上请求/响应。感谢您的回复。因此,它将反序列化到请求DTO中,从而阻止此操作。我意识到GET是一个更好的动词,但是创建一个javascript对象并将其发布为JSON非常容易。我将不得不研究在javascript中创建查询字符串的更简单的方法。感谢您花时间和精力回复:
[Route("/processresults")]
public class FindProcessResults : QueryBase<ProcessResult, ProcessResultDto>
{
public int Id { get; set; }
}