gpt4 book ai didi

c# - 在 ServiceStack 中访问自定义 ServiceRunner 的 HandleException 中的 responseDTO 类型

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:45 25 4
gpt4 key购买 nike

我编写了自定义 ServiceRunner 并覆盖了 HandleException 方法。如我所见,如果服务中出现未处理的异常,HandleException 方法返回的对象将成为服务响应。我希望返回与服务在成功时返回的相同的 responseDTO 类型。有什么方法可以访问遇到异常的服务的 responseDTO 类型 HandleException 内部?

编辑:根据收到的答复,我使用定义如下的 DTO/服务类型实现了服务(在 F# 中):

type CS()=
interface IReturn<Op<list<Y>,list<E>>>
member val key = List<int>() with get,set

type CSService() =
interface IService
member this.Get(request: CS)=
//service code here returning Op<list<Y>,seq<E>> type

因此,我希望在 HandleException 中收到的类型是 Op<list<Y>,list<E>>(Y 和 E 是在 bin 文件夹中可用的 dll 中定义的已知类型)

根据建议,我尝试了以下两个选项,因为 WebRequestUtils 在两个命名空间中都可用:

Type test1 = ServiceStack.WebRequestUtils.GetErrorResponseDtoType(request.GetType());//error
Type test2 = ServiceStack.ServiceClient.Web.WebRequestUtils.GetErrorResponseDtoType(request.GetType());

对于 test1,我收到以下异常:

Could not load type 'ServiceStack.ErrorResponse' from assembly 'ServiceStack.Interfaces, Version=3.9.71.0, Culture=neutral, PublicKeyToken=null'.

堆栈跟踪:

at ServiceStack.WebRequestUtils.GetErrorResponseDtoType(Type requestType)
at M.ServiceStackWebAPP.MyCustomServiceRunner`1.HandleException(IRequestContext requestContext, TRequest request, Exception ex) in d:\Projects\ServiceStack\M.WebService\MyCustomServiceRunner.cs:line 167
at ServiceStack.ServiceHost.ServiceRunner`1.Execute(IRequestContext requestContext, Object instance, TRequest request)
at ServiceStack.ServiceHost.ServiceRunner`1.Process(IRequestContext requestContext, Object instance, Object request)
at ServiceStack.ServiceHost.NServiceExec`1.Execute(IRequestContext requestContext, Object instance, Object request, String requestName)
at ServiceStack.ServiceHost.NServiceRequestExec`2.Execute(IRequestContext requestContext, Object instance, Object request)
at ServiceStack.ServiceHost.ServiceController.<>c__DisplayClass15.<>c__DisplayClass17.<RegisterNServiceExecutor>b__14(IRequestContext reqCtx, Object req)
at ServiceStack.ServiceHost.ServiceController.ManagedServiceExec(ServiceExecFn serviceExec, Object service, IRequestContext requestContext, Object dto)
at ServiceStack.ServiceHost.ServiceController.<>c__DisplayClass15.<RegisterNServiceExecutor>b__13(IRequestContext requestContext, Object dto)
at ServiceStack.ServiceHost.ServiceController.Execute(Object request, IRequestContext requestContext)
at ServiceStack.WebHost.Endpoints.EndpointHost.ExecuteService(Object request, EndpointAttributes endpointAttributes, IHttpRequest httpReq, IHttpResponse httpRes)
at ServiceStack.WebHost.Endpoints.Support.EndpointHandlerBase.ExecuteService(Object request, EndpointAttributes endpointAttributes, IHttpRequest httpReq, IHttpResponse httpRes)
at ServiceStack.WebHost.Endpoints.RestHandler.GetResponse(IHttpRequest httpReq, IHttpResponse httpRes, Object request)
at ServiceStack.WebHost.Endpoints.RestHandler.ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, String operationName)

测试 2 调用成功,但我收到 ErrorResponse键入返回值而不是预期的 Op<list<Y>,list<E>> .

我还遗漏了什么吗?

最佳答案

由于 ServiceStack 服务允许您返回任何响应类型,因此最终不可能确切知道如果没有发生异常服务会返回什么,因为这将取决于执行的运行时服务实现逻辑抛出异常后,例如:

public object Any(Request request)
{
throw new Exception(); //No way of knowing what Service would've returned

if (SomeCustomLogic(request))
return new Response1();

return new Response2();
}

虽然如果您按照 ServiceStack 的建议将您的请求 DTO 标记为返回类型,例如:

public class MyRequest : IReturn<MyResponse> { ... }

或者 ServiceStack 的约定,以带有 Response 后缀的 Request DTO 命名 Response DTO,例如:

public class GetCustomers { ... } 
public class GetCustomersResponse { ... }

然后您可以使用 WebRequestUtils.GetErrorResponseDtoType(requestType) 从请求 DTO 类型中检索响应类型,例如:

public override object HandleException(IRequest request, T requestDto, Exception ex)
{
var responseType = WebRequestUtils.GetErrorResponseDtoType(requestDto.GetType());
}

如果 ServiceStack 无法推断响应类型(即不使用上面推荐的约定),这将返回通用的 ErrorResponse 类型。

另请注意,您可以使用更有用的 DtoUtils.CreateErrorResponse() 返回填充的错误响应 DTO,该 DTO 将填充响应 DTO 的 ResponseStatus 属性异常,例如:

public override object HandleException(IRequest request, T requestDto, Exception ex)
{
var errorResponse = DtoUtils.CreateErrorResponse(requestDto, ex);
}

关于c# - 在 ServiceStack 中访问自定义 ServiceRunner 的 HandleException 中的 responseDTO 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39872254/

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