servicestack ServiceStack自动查询,隐式/显式查询,servicestack,ormlite-servicestack,servicestack,ormlite Servicestack" /> servicestack ServiceStack自动查询,隐式/显式查询,servicestack,ormlite-servicestack,servicestack,ormlite Servicestack" />

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; }
}