servicestack,C#,Web Services,servicestack" /> servicestack,C#,Web Services,servicestack" />

C# 使用ServiceStack处理错误消息

C# 使用ServiceStack处理错误消息,c#,web-services,servicestack,C#,Web Services,servicestack,有没有一种推荐的方法可以将错误消息保存在Web服务请求的对象中 在一些示例中,我看到webservices返回一个包含一些HTTP错误代码的包装器类,而另一些则包含.NET异常的消息。另一方面,也有返回普通对象或对象列表的示例。错误处理一开始可能会令人困惑。这个但本质上,ServiceStack尝试以一致的方式返回错误,以便您的客户端始终知道如何处理它们。您应该以正常的c方式抛出异常,ServiceStack将捕获这些异常并将其封装在ResponseStatus对象中,如下所示: 公共阶级责任

有没有一种推荐的方法可以将错误消息保存在Web服务请求的对象中


在一些示例中,我看到webservices返回一个包含一些HTTP错误代码的包装器类,而另一些则包含.NET异常的消息。另一方面,也有返回普通对象或对象列表的示例。

错误处理一开始可能会令人困惑。这个但本质上,ServiceStack尝试以一致的方式返回错误,以便您的客户端始终知道如何处理它们。您应该以正常的c方式抛出异常,ServiceStack将捕获这些异常并将其封装在ResponseStatus对象中,如下所示:

公共阶级责任 { 公共字符串错误代码{get;set;} 公共字符串消息{get;set;} 公共字符串StackTrace{get;set;} 公共列表错误{get;set;} } 因此,您将收到一个响应对象,该对象包含一个名为ResponseStatus的属性,该属性具有上面填充的ResponseStatus对象

注意事项:

只有在ServiceStack AppHost配置中启用调试模式时,才会包含StackTrace属性。i、 e:

SetConfignew主机配置{DebugMode=true}; 这将是您所引用的.NET异常,并根据是否设置了DebugMode有条件地显示

ResponseError的错误列表仅针对验证错误失败填充。这将是验证错误的列表。这就是为什么在一些示例中,您会看到一个简单的错误响应,即不是验证错误,以及一个带有错误列表的响应,附加了验证错误。您还应该阅读有关的部分。ResponseError对象的格式如下:

公共类响应者 { 公共字符串错误代码{get;set;} 公共字符串字段名{get;set;} 公共字符串消息{get;set;} } ResponseStatus对象的错误代码和消息将取自错误列表的第一项

让一些人困惑的是,如何将ResponseStatus作为预期响应请求的属性

假设您想要返回一个Person对象,如下所示:

class Person
{
    string FirstName { get; set; }
    string LastName { get; set; }
}
如果针对返回此人响应的请求引发验证异常,您可能会得到如下JSON响应:

{ 响应状态:{ 错误代码:不应该是空的, 消息:“FirstName”不应为空, StackTrace:。。。 错误:[ { 错误代码:不应该是空的, 字段名:FirstName, 消息:“FirstName”不应为空 }, { 错误代码:不应该是空的, 字段名:LastName, 消息:“LastName”不应为空 }, ] } } 请注意,Person的响应对象不包括在此响应中,只是包含ResponseStatus属性的对象。如果要包含状态为的响应对象,则必须以以下方式声明person类:

类人反应 { ResponseStatus ResponseStatus{get;set;} 字符串名{get;set;} 字符串LastName{get;set;} } 然后,当抛出异常时,响应将包括响应对象及其状态:

{ 名字:, 姓氏:, 响应状态:{ ...
ServiceStack为您提供了对引发异常时返回的错误格式的大量控制。您最好阅读我上面链接的官方文档以了解它。自定义更像是一个高级主题。

错误处理一开始可能会令人困惑。但本质上ServiceStack试图以一致的方式返回错误,以便您的客户端始终知道如何处理它们。您应该以正常的c方式抛出异常,ServiceStack将捕获这些异常并将其封装在ResponseStatus对象中,如下所示:

公共阶级责任 { 公共字符串错误代码{get;set;} 公共字符串消息{get;set;} 公共字符串StackTrace{get;set;} 公共列表错误{get;set;} } 因此,您将收到一个响应对象,该对象包含一个名为ResponseStatus的属性,该属性具有上面填充的ResponseStatus对象

注意事项:

只有在ServiceStack AppHost配置中启用调试模式时,才会包括StackTrace属性。例如:

SetConfignew主机配置{DebugMode=true}; 这将是您所引用的.NET异常,并根据是否设置了DebugMode有条件地显示

ResponseError的错误列表仅针对验证错误失败进行填充。这将是验证错误列表。这就是为什么在某些示例中,您会看到一个简单的错误响应,即不是验证错误,以及一个带有错误列表的响应附加了验证错误。您还应该阅读有关的部分。Re的格式 sponseError对象是这样的:

公共类响应者 { 公共字符串错误代码{get;set;} 公共字符串字段名{get;set;} 公共字符串消息{get;set;} } ResponseStatus对象的错误代码和消息将取自错误列表的第一项

让一些人困惑的是,如何将ResponseStatus作为预期响应请求的属性

假设您想要返回一个Person对象,如下所示:

class Person
{
    string FirstName { get; set; }
    string LastName { get; set; }
}
如果针对返回此人响应的请求引发验证异常,您可能会得到如下JSON响应:

{ 响应状态:{ 错误代码:不应该是空的, 消息:“FirstName”不应为空, StackTrace:。。。 错误:[ { 错误代码:不应该是空的, 字段名:FirstName, 消息:“FirstName”不应为空 }, { 错误代码:不应该是空的, 字段名:LastName, 消息:“LastName”不应为空 }, ] } } 请注意,Person的响应对象不包括在此响应中,只是包含ResponseStatus属性的对象。如果要包含状态为的响应对象,则必须以以下方式声明person类:

类人反应 { ResponseStatus ResponseStatus{get;set;} 字符串名{get;set;} 字符串LastName{get;set;} } 然后,当抛出异常时,响应将包括响应对象及其状态:

{ 名字:, 姓氏:, 响应状态:{ ...
ServiceStack为您提供了对引发异常时返回的错误格式的大量控制,您最好阅读我上面链接的官方文档以了解它。定制更像是一个高级主题。

您好,伯特,正如我之前建议的,我已经删除了序言。人们更倾向于回答如果您的问题没有阅读大量无关信息,则您的问题将被删除。此问题现在已精确。您的其他问题仍将与其他ServiceStack问题一起找到,而不会被链接到。您好,伯特,正如我之前所建议的,我已删除序言。如果您的问题没有阅读大量内容,人们会更倾向于回答您的问题无关信息。此问题现在是精确的。您的其他问题仍将与其他ServiceStack问题一起找到,而不会链接到。回答非常好且清晰。不过,我有一个问题:如果我无法编辑响应DTO,因为它位于另一个我不拥有的DLL中,我可以发送抛出的DTO的名称某种方式的异常?@RPDeshaies如果您不能修改DTO响应,也许您可以通过覆盖AppHost中的OnServiceExceptionRequest httpReq、object request、Exception ex方法来设置一个包含详细信息的自定义标头。然后使用httpReq.response将ex的详细信息设置为标头。这样您就可以在y中看到该标头我们的客户端。回答非常好且清晰。不过,我有一个问题:如果我无法编辑响应DTO,因为它位于另一个我不拥有的DLL中,那么我可以以某种方式发送引发的异常的名称?@RPDeshaies如果您无法修改DTO响应,也许您可以通过覆盖On来设置带有详细信息的自定义头AppHost中的ServiceExceptionRequest httpReq、object request、Exception ex方法。然后使用httpReq.Response将ex out的详细信息设置为标头。这样,您就可以在客户端中看到该标头。