ServiceStack:错误未序列化到响应状态

Posted

技术标签:

【中文标题】ServiceStack:错误未序列化到响应状态【英文标题】:ServiceStack: Errors not serialized to responsestatus 【发布时间】:2013-03-24 08:08:37 【问题描述】:

我是服务堆栈的新手,已经苦苦挣扎了好几个小时,试图让服务堆栈为我工作。目前主要的表演障碍是我无法使异常部分起作用。我按本书注册了所有插件,服务适用于 REST、Soap、CSV、XML 和 JSV。该项目包含 4 种基本测试方法,用于对客户对象进行 crud 操作。抛出错误时,我没有收到预期的错误:未设置 ResponseStatus 并生成一般错误。有人可以帮我找出原因吗?

https://dl.dropbox.com/u/101619220/TestingServiceStack.zip

编辑:感谢您的评论:)

我创建了一个简单的 AppHost 文件:

命名空间测试服务堆栈 公共类 AppHost : AppHostBase 公共应用主机() : base("StarterTemplate ASP.NET Host", typeof(CustomersService).Assembly)

    public override void Configure(Container container)
    
        Plugins.Add(new ValidationFeature());
        Plugins.Add(new RequestLogsFeature());

        SetConfig(new EndpointHostConfig
            
                DebugMode = true, //Enable StackTraces in development
            );

        LogManager.LogFactory = new Log4NetFactory(true);

        JsConfig.EmitCamelCaseNames = true;
        JsConfig.DateHandler = JsonDateHandler.ISO8601;

        Routes.Add<GetCustomers>("/customers", "GET")
              .Add<GetCustomers>("/customers/Id", "GET")
              .Add<AddCustomer>("/customers", "POST")
              .Add<UpdateCustomer>("/customers/Id", "PUT")
              .Add<DeleteCustomer>("/customers/Id", "DELETE");
    

    public static void Start()
    
        new AppHost().Init();
    

还有一项服务:

命名空间测试服务堆栈 公共类CustomersService:服务 #region 日志记录

    private static readonly ILog Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

    #endregion

    public object Any(GetCustomers request)
    
        GetCustomersResponse response = null;
        try
        
            if (request.Id != "0")
                throw HttpError.NotFound("Id 0 throws error".Fmt(request.Id));

            response = new GetCustomersResponse Id = request.Id ?? "notset", Name = "GetCustomers";
        
        catch (Exception ex)
        
            Log.Error(base.RequestContext.Get<IHttpRequest>(), ex);
            throw;
        

        return response;
    

    public object Any(AddCustomer request)
    
        return new AddCustomerResponse Id = request.Id, Name = "AddCustomer";
    

    public object Any(UpdateCustomer request)
    
        return new UpdateCustomerResponse Id = request.Id, Name = request.Name;
    

    public object Any(DeleteCustomer request)
    
        return new DeleteCustomerResponse Id = request.Id, Name = "DeleteCustomer";
    

而交换的对象是:

使用 System.Runtime.Serialization; 使用 ServiceStack.ServiceInterface.ServiceModel;

命名空间测试服务堆栈 [数据合约] 公共类 GetCustomers [数据成员] 公共字符串 ID 获取;放;

[DataContract]
public class UpdateCustomer

    [DataMember]
    public string Id  get; set; 

    [DataMember]
    public string Name  get; set; 


[DataContract]
public class AddCustomer

    [DataMember]
    public string Id  get; set; 

    [DataMember]
    public string Name  get; set; 


[DataContract]
public class DeleteCustomer

    [DataMember]
    public string Id  get; set; 


[DataContract]
public class GetCustomersResponse : IHasResponseStatus

    [DataMember]
    public string Id  get; set; 

    [DataMember]
    public string Name  get; set; 

    [DataMember]
    public ResponseStatus ResponseStatus  get; set; 


[DataContract]
public class UpdateCustomerResponse : IHasResponseStatus

    [DataMember]
    public string Id  get; set; 

    [DataMember]
    public string Name  get; set; 

    [DataMember]
    public ResponseStatus ResponseStatus  get; set; 


[DataContract]
public class AddCustomerResponse : IHasResponseStatus

    [DataMember]
    public string Id  get; set; 

    [DataMember]
    public string Name  get; set; 

    [DataMember]
    public ResponseStatus ResponseStatus  get; set; 


[DataContract]
public class DeleteCustomerResponse : IHasResponseStatus

    [DataMember]
    public string Id  get; set; 

    [DataMember]
    public string Name  get; set; 

    [DataMember]
    public ResponseStatus ResponseStatus  get; set; 

我使用 SoapUi 调用 GetCustomers 方法,如果 id 等于 0,则会引发错误,我希望设置 ResponseStatus,但事实并非如此。从 SoapUi 调用时,出现以下错误:

我不知道如何正确设置响应状态,感谢任何提示。

【问题讨论】:

像这样放弃你的项目并没有什么帮助,只会让你想帮助你的人花费更多的时间。提出一个具体、清晰和简洁的问题,包括并粘贴代码的相关部分,并确切地解释您的问题是什么,即您尝试了什么以及您期望会发生什么。知道应该设计支持问题来建立知识库并帮助遇到类似问题的其他人。只是转储你的项目对这一切都没有帮助。如果其他人无法仅从问题描述中推断出您的问题,基本上不要指望他们会提供帮助。 问题更新远不足以回答这个问题,不要指望任何人打开你的项目,所以如果我们不能从问题中确定问题,它会去被忽略。 AppHost 定义没有解释错误是什么、您尝试了什么、您预期会发生什么以及实际发生了什么。 这是我在这里的第一篇文章,分两步完成。如果信息缺失,请告诉我。 问一个好问题不需要知道太多,只是不要假设其他人对您的具体问题一无所知,包括所有相关信息和上下文,并明确您的问题是。 我不确定我是否理解您的回答。我是否不应该期望 ServiceStack 可以与 SoapUi 一起使用——在这种情况下它是简单的纯肥皂交换?除了处理异常外,一切正常。我还阅读了关于 servicestack 中soap 的限制,如您所见,我从那里复制了很多代码。如果你能给我一个提示我在这里缺少什么,我仍然会非常感谢? 【参考方案1】:

我按本书注册了所有插件,服务适用于 REST、Soap、CSV、XML 和 JSV 要回应@mythz,用错误或异常示例明确说明的问题来回答直接问题要容易得多。我对上述陈述/概括的问题是我不知道“按书本”是什么意思,也不知道您的工作概念是(可能构建成功,显示元数据页面等)

ResponseStatus 未设置并生成一般错误。

在您的 CustomersService 类中,您似乎正在抛出一个错误 (HttpError) 并捕获/记录它。然后代码将继续返回空响应。 ServiceStack 原生支持抛出异常。如果您将 throw 添加到您的 catch 中(假设您想保留捕获以用于记录目的),您应该得到一个填充的 ResponseStatus。

        GetCustomersResponse response = null;
        try
        
            if (request.Id != "0")
                throw HttpError.NotFound("Id 0 throws error".Fmt(request.Id));

            response = new GetCustomersResponse Id = request.Id ?? "notset", Name = "GetCustomers";
        
        catch (Exception ex)
        
            Log.Error(base.RequestContext.Get<IHttpRequest>(), ex);
            throw; //Let ServiceStack do its thing.
        

        return response;

SoapUI

此更改可能会解决 soapUI 的问题,但我不清楚您收到的“一般错误”是什么。我猜这个问题可能是由于“反序列化”一个空响应。

【讨论】:

【参考方案2】:

ServiceStack 不支持使用第 3 方 SOAP 库或客户端代理进行故障排除。

有关集成测试中的异常示例,请参阅WebServicesTests.cs。对于 SOAP,您还需要阅读 ServiceStack's SOAP Support and its limitations

【讨论】:

我不确定我是否理解您的回答。我是否不应该期望 ServiceStack 可以与 SoapUi 一起使用——在这种情况下它是简单的纯肥皂交换?除了处理异常外,一切正常。我还阅读了关于 servicestack 中soap 的限制,如您所见,我从那里复制了很多代码。如果你能给我一个提示我在这里缺少什么,我仍然会非常感谢? 我还将尝试使用您链接到的示例构建测试用例 - 谢谢。 ***.com/questions/15480563/… - 这可能会有所帮助。 我是说我们不会花时间对外国 SOAP 客户端代理进行故障排除或测试,因为它没有经过测试或官方支持,除非您想自己花时间来识别和识别,否则不建议这样做解决兼容性问题。您可以使用 ServiceStack 的内置 C# Soap ServiceClient 或 VS.NET 中的“添加服务引用”工具。【参考方案3】:

我们遇到了未填充 ResponseStatus 的问题 - 我们使用 DataContract/DataMember 修饰了 Response DTO,但没有使用 ResponseStatus 属性。一旦我们添加了那个装饰,一切都很愉快。

【讨论】:

以上是关于ServiceStack:错误未序列化到响应状态的主要内容,如果未能解决你的问题,请参考以下文章

ServiceStack JsonSerializer 不序列化公共成员

如何让 ServiceStack 序列化/反序列化具有正确类型的 expando 对象

将 ServiceStack 客户端与区分大小写的 REST 服务一起使用

错误:加载资源失败:服务器响应状态为 404(未找到)

加载资源失败:服务器响应状态为 404(未找到)

未处理的拒绝(错误):响应不成功:收到状态码 400 new ApolloError