public class MyServices : Service
{
public object Get(Hello request)
{
throw new InvalidOperationException("test error message");
//return new HelloResponse { Result = "Hello, {0}!".Fmt(request.Name) };
}
}
try
{
var client = new JsonServiceClient("http://localhost:28586/");
var response = client.Get<HelloResponse>(new Hello { Name = "DHJ" });
}
catch (WebServiceException ex)
{
// ex.ErrorCode = "InvalidOperationException" // No Problem.
// ex.ErrorMessage = null // always null. Why?
}
我看到ServiceStack的文档如下:
抛出C#异常
在大多数情况下,您不需要关心ServiceStack的错误处理,因为它为抛出C#异常的正常用例提供本机支持,例如:
公共对象帖子(用户请求) { if(string.IsNullOrEmpty(request.Name)) 抛出新的ArgumentNullException(&#34; Name&#34;); } HTTP错误的C#异常的默认映射
默认C#例外:
返回继承自ArgumentException的HTTP StatusCode为400 BadRequest NotImplementedException或NotSupportedException作为405 MethodNotAllowed返回 AuthenticationException以401 Unauthorized身份返回 UnauthorizedAccessException以403 Forbidden的形式返回 OptimisticConcurrencyException返回为409 Conflict 其他正常的C#异常作为500 InternalServerError返回 可以使用Config.MapExceptionToStatusCode上的用户定义映射扩展此列表。
答案 0 :(得分:1)
您的HelloResponse
课程需要Error Handling docs中的ResponseStatus
媒体资源:
抛出异常时返回的错误响应取决于是否存在常规命名的{RequestDto}Response
DTO。
无论服务方法的响应类型如何,都会返回{RequestDto}Response
。如果{RequestDto}Response
DTO具有 ResponseStatus 属性,则会填充该属性,否则将不会返回 ResponseStatus 。 (如果您使用{ResponseDto}Response
属性修饰了[DataContract]/[DataMember]
类和属性,那么 ResponseStatus 也需要进行修饰,以便填充。
通过填充 ResponseStatus 属性返回通用ErrorResponse
。