ServiceStack不会填充错误响应

Seb*_*eth 2 servicestack

我们正在使用ServiceStack开发一个项目(喜欢它),但需要一些奇怪问题的帮助。在我们的项目中,我们使用辅助方法抛出或返回带有ErrorResponse和ResponseStatus对象的各种类型的HttpError。

它遵循此处描述的模式。像这样:

protected HttpError BusinessError(string summaryMessage = "Some generic validation summary.")
    {           
        return new HttpError(HttpStatusCode.BadRequest, "MyValidationType", summaryMessage)
        {                           
            Response = new ErrorResponse
            {
                ResponseStatus = new ResponseStatus
                {
                    ErrorCode = "MyValidationType",
                    Message = summaryMessage,
                    Errors = new List<ResponseError>()
                },
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

在服务电话中,我们将这样使用它:

throw BusinessError("Help I've fallen and can't get up!");
Run Code Online (Sandbox Code Playgroud)

这会起作用,我们将其馈送到ss-validation JS库中以呈现我们的验证消息。很好

问题在于,现在ServiceStack不会将HttpError的任何详细信息序列化到响应中。我们得到的只是一个带有400状态代码,“ MyValidationType”错误代码和空JSON响应的响应{}

我已经尝试过使用抛出/返回错误以及将服务方法的返回类型切换为objectetc的组合,但是似乎没有什么不同。老实说,我不确定我们在项目中可能发生了什么更改而导致这种行为。

对于可能导致此问题的任何建议或建议,我将不胜感激。

myt*_*thz 5

如果您使用{RequestName}{RequestName}Response命名约定,并且Response DTO没有ResponseStatus属性,则会发生这种情况:

无论服务方法的响应类型如何,都将返回{RequestDto} Response。如果{RequestDto} Response DTO 具有ResponseStatus属性,则将其填充,否则将不返回ResponseStatus。(如果您已经使用[DataContract] / [DataMember]属性修饰了{ResponseDto} Response类和属性,则还需要修饰ResponseStatus来进行填充)。

在这种情况下,解决方案是将ResponseStatus属性添加到R​​esponse DTO:

public class RequestNameResponse
{
    public ResponseStatus ResponseStatus { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • @Martaver如果您确实使用RequestResponse模式,则只需添加ResponseStatus属性。我个人使用显式Response DTO,因此以后可以修改响应以返回额外的数据/元数据而不破坏客户端,如果您的[Service返回JSON数组],也存在安全风险(http://haacked.com/archive/2009/ 06/25 / json-hijacking.aspx /),这是我避免使用它的另一个原因。最终取决于您选择做什么,您只需要记住是否使用RequestResponse约定,Response DTO总是会从该服务中返回。 (2认同)