Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Error handling ServiceStack-如何从RequestFilter返回ResponseDTO?_Error Handling_Request_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,Error Handling,Request,servicestack" /> servicestack,Error Handling,Request,servicestack" />

Error handling ServiceStack-如何从RequestFilter返回ResponseDTO?

Error handling ServiceStack-如何从RequestFilter返回ResponseDTO?,error-handling,request,servicestack,Error Handling,Request,servicestack,我正在使用RequestFilter预处理一些发送到web服务的消息,如果有错误,我希望返回ResponseDTO,然后终止对请求的进一步处理。如何实现该功能 另外,我通过在RequestDTO类上使用[RequestFilter]装饰器来实现这一点。如果我想有多个请求筛选器,如何选择用于给定请求的筛选器?如果有错误,我想返回一个ResponseDTO,然后终止对请求的进一步处理。如何实现该功能?不确定如何确定错误,因此这是一个非常基本的解决方案 public class RequestFilt

我正在使用RequestFilter预处理一些发送到web服务的消息,如果有错误,我希望返回ResponseDTO,然后终止对请求的进一步处理。如何实现该功能


另外,我通过在RequestDTO类上使用[RequestFilter]装饰器来实现这一点。如果我想有多个请求筛选器,如何选择用于给定请求的筛选器?如果有错误,我想返回一个ResponseDTO,然后终止对请求的进一步处理。如何实现该功能?不确定如何确定错误,因此这是一个非常基本的解决方案

public class RequestFilterAttribute : Attribute, IHasRequestFilter
{
    public void RequestFilter(IHttpRequest req, IHttpResponse res, object requestDto)
    {
        if(requestDto.GetType() == typeof(YourRequestType))
        {
            //code to check for errors - if error throw exception 
            throw new Exception("Exception for your request type");
        }
    }
}
如果我希望有多个请求筛选器,如何选择用于给定请求的筛选器?

您可以创建几个不同的RequestFilter实现,并用不同的实现装饰每个DTO

public class FilterOneAttribute : Attribute, IHasRequestFilter
{
    //Code
}

public class FilterTwoAttribute : Attribute, IHasRequestFilter
{
    //Code
}

[FilterOne]
public class OneClass 
{
    //Code
}

[FilterTwo]
public class TwoClass
{
    //Code
}

上面的答案说明了如何选择过滤器以及如何失败,但没有说明如何返回成功的替代响应。显示如何创建适当的ResponseTo。关键是将ResponseDTO序列化到响应流,然后关闭该流。我猜ServiceStack会以此作为提示,不运行服务或任何其他筛选器。

请注意,您可以修饰相应的服务而不是DTO,以避免与消费者共享请求筛选器实现。对,关闭响应流告诉ServiceStack请求已被处理,它应该停止对请求的进一步处理。建议关闭响应流的方法是使用
httpRes.EndServiceStackRequest()
扩展方法,该方法还将写出任何全局头(如果指定)。