【问题标题】:delegatingHandler (webapi) equivalent in servicestackservicestack 中的 delegatingHandler (webapi) 等效项
【发布时间】:2013-04-09 06:13:38
【问题描述】:

我正在尝试从 asp.net mvc4 webapi 框架迁移到 servicestack 框架。我在 webapi 中有一个 delegatingHandler,在 servicestack 中有什么等价的?

我将在这里验证我的请求并返回自定义响应,而无需进一步操作。

我的委托处理人

public class xyzDH : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        int maxLengthAllowed = 200;
        long? contentLen = request.Content.Headers.ContentLength; 
        if (contentLen > maxLengthAllowed)
        {
            var defaultResponse = ResponseHelper.GetBaseResponse("Content Lenght Issue", true, UploadLogSizeIssue);
            return Task<HttpResponseMessage>.Factory.StartNew(() =>
            {
                var response = new HttpResponseMessage(HttpStatusCode.OK)
                    {
                        Content = new StringContent(defaultResponse.ToString(), Encoding.UTF8, "message/http")
                    };
                return response;
            });
        }

        return base.SendAsync(request, cancellationToken);
    }
}

【问题讨论】:

    标签: asp.net-web-api servicestack


    【解决方案1】:

    最好浏览一下ServiceStack's simple Architecture,让您大致了解 ServiceStack 是如何组合在一起的。

    Custom Hooks, Filters and Extensibility points

    ServiceStack 允许Order of Operations wiki page 中标识的许多自定义挂钩和可扩展点。您可以使用自定义 Filter AttributeGlobal Filters 来执行此操作,这样您就可以直接写入响应,之后您可以调用 httpResponse.EndServiceStackRequest() 扩展方法来表示不应再对请求进行处理。

    Validators

    由于您在请求验证的上下文中询问,您应该查看ServiceStack's built-in validation,它允许使用内置的 FluentValidation 进行声明式验证。

    Error Handling

    在很多情况下,只需抛出一个普通的 C# 异常即可。 ServiceStack 提供了一个很好的故事,其中包括序列化服务客户端中的异常。阅读Error Handling wiki,了解自定义异常处理的不同方法。

    使用全局请求过滤器

    这是您可以使用 ServiceStack Global Request Filter 重写 WebApi 委托处理程序的方法:

    this.RequestFilters.Add((httpReq, httpResp, requestDto) =>
    {
        int maxLengthAllowed = 200;
        if (httpReq.ContentLength > maxLengthAllowed)
        {
            //httpRes.StatusCode = 200; //No-op, not needed since its the default
            //Guess it could also be "message/http" but never heard of it
            httpRes.ContentType = "text/plain"; 
            httpRes.Write("Content Length Issue"); //Whatever you want in body
            httpRes.EndServiceStackRequest(); //No more processing for this request
        }
    });
    

    警告:如上所示,对于无效的 HTTP 请求,不建议返回 200 OK。如果请求无效,则应该是 400 BadRequest 错误,这是 ServiceStack 会在您 throw a C# Exception inheriting ArgumentException 时自动写入的错误。

    【讨论】:

    • 例如,如果我想根据内容长度进行验证,如果内容长度 > 200,则返回自定义 httpresponse (httpstatuscode.ok)。我在哪里可以做到这一点?
    • 为什么要在不先处理请求的情况下返回 200 OK?如果没问题,请保持请求不变,让它通过以由服务处理,否则将 HTTP 错误写入响应并使用httpRes.EndServiceStackRequest() 关闭请求。您也可以使用if (base.Request.ContentLength &lt; 200) throw ex 在服务内部进行此验证
    • 因为它是一个业务逻辑(不接受超过 200 的内容长度)而不是实际错误,我试图返回 200 并带有适当的消息
    • 它永远不应该是200 OK(它向客户端发出信号表明请求很好)它应该是400 Bad Request,只要您抛出任何继承自@987654341的异常,ServiceStack就会默认写入@。我将更新我的答案,以展示如何使用全局过滤器做你想做的事情。如果您不希望它在全球范围内应用,请使用 Request Filter Attribute 并根据需要应用。
    • 为了您的方便,我已经添加了我目前在 webapi 中的代码,你能告诉我如何使用全局过滤器或任何合适的方法来实现这一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 2013-09-13
    相关资源
    最近更新 更多