1

我正在尝试从 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);
    }
}
4

1 回答 1

5

浏览一下ServiceStack 的简单架构是一个好主意,可以让您全面了解 ServiceStack 是如何组合在一起的。

自定义挂钩、过滤器和扩展点

ServiceStack 允许在Order of Operations wiki 页面中确定许多自定义挂钩和可扩展点。您可以使用自定义过滤器属性全局过滤器来执行此操作,这使您可以直接写入响应,之后您可以调用httpResponse.EndServiceStackRequest()扩展方法来表示不应再对请求进行处理。

验证器

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

错误处理

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

使用全局请求过滤器

这是您可以使用 ServiceStack全局请求过滤器重写 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
    }
});

警告:不建议返回200 OK无效的 HTTP 请求,如上所示。如果请求无效,它应该是一个400 BadRequest错误,当您抛出一个继承 ArgumentException 的 C# Exception时,ServiceStack 将自动写入该错误。

于 2013-04-08T21:39:35.520 回答