gpt4 book ai didi

c# - 如何从 ServiceStack 中返回 Stream 的 Action 获取异常的正常/自定义错误响应?

转载 作者:行者123 更新时间:2023-11-30 20:35:14 24 4
gpt4 key购买 nike

我一直在 ServiceStack 的 documentation 中冒险关于从返回 Stream 的 Action 中抛出 Exceptions 的问题。

问题是,虽然我服务中的所有其他 Action 都返回漂亮的错误,例如:

{
"ResponseStatus": {
"ErrorCode": "ArgumentException",
"Message": "Unable to load data",
"StackTrace": "[GetData: 7/11/2016 1:02:11 PM]:\n[REQUEST: {Token:asdf,Id:1}]\nServiceStack.HttpError: Unable to load codes from token ---> System.ArgumentException: Unable to load codes from token.............(abridged)
}
}

有一个返回类型为 Stream 的 Action,无论返回的异常类型如何,http 客户端都会收到以下响应:

使用处理程序(根据 SS 文档):

Error: ArgumentNullException: As result 'ErrorResponse' is not a supported responseType, a defaultAction must be supplied
Parameter name: defaultAction

没有任何处理程序:

'no content'

400

任何帮助将不胜感激。

示例代码-->

这是一个 Action 示例:

[AddHeader(ContentType = "application/pdf")]
public Stream Get(GetPdfRequest request)
{
throw new NotImplementedException("FAKE EXCEPTION");
}

在 APPHOST 的 Configure() 方法中:

this.UncaughtExceptionHandlers.Add((req, res, operationName, ex) =>
{
var logger = LogManager.GetLogger(GetType());
logger.Error("Unhandled error in API during request binding.", ex);

res.Write("Error: {0}: {1}".Fmt(ex.GetType().Name, ex.Message));
res.EndRequest(skipHeaders: true);
});

this.ServiceExceptionHandlers.Add((httpReq, request, exception) =>
{
var logger = LogManager.GetLogger(GetType());
logger.Error("Unhandled error in API.", exception);

//call default SS exception handler
return DtoUtils.CreateErrorResponse(request, exception);
});

这是调用上述 Action 时我在 Swagger Rest 客户端上看到的屏幕截图。

Exception on Swagger

最佳答案

问题是由于无法将 ErrorResponse DTO 序列化为未注册的“application/pdf”ContentType。

我刚刚添加了一个回退以使用 Config.DefaultContentType 来序列化未注册内容类型中的错误 in this commit ,从现在的 v4.0.61 开始可用 available on MyGet .

ServiceStack 先前版本的解决方法是不使用 [AddHeader] 请求过滤器属性,而是在序列化之前在服务实现中设置 Content-Type,因此会抛出任何异常在设置 Response ContentType 之前,例如:

public class ErrorStream {}
public class ErrorStreamService : Service
{
public Stream Any(ErrorStream request)
{
if (!IsValid(request))
throw new NotImplementedException("Exception in Stream Response");

base.Request.ResponseContentType = "application/pdf";

return PdfAsStream(request);
}
}

在使用服务客户端时抛出类型化异常:

try
{
var response = client.Get<Stream>(new ErrorStream());
Assert.Fail();
}
catch (WebServiceException ex)
{
Assert.That(ex.IsAny400());
Assert.That(!ex.IsAny500());
Assert.That(ex.ErrorCode, Is.EqualTo("NotImplementedException"));
Assert.That(ex.StatusCode, Is.EqualTo((int)HttpStatusCode.MethodNotAllowed));
}

此外,UncaughtExceptionHandlers 仅用于处理服务外抛出的异常,服务内发生的异常由ServiceExceptionHandlers 处理,但修改默认值时要小心异常处理行为,因为您可以使客户端上的类型化异常处理无效。

关于c# - 如何从 ServiceStack 中返回 Stream 的 Action 获取异常的正常/自定义错误响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38308703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com