压缩响应过滤器在breeze.js元数据调用上失败

时间:2014-12-27 17:37:15

标签: filter metadata action gzip breeze

我有一个http模块,我在下面添加一个响应过滤器进行压缩。这适用于除1之外的所有API调用,即对MetaData的调用。如果我删除[BreezeController]装饰它工作正常。我认为它与action filter属性有关,它将字符串返回类型转换为带有字符串内容的HttpResponse返回类型。

我得到的错误是“异常消息:底层压缩例程的流状态不一致。”

我做了一些测试,其中定义为返回HttpResponse的方法工作正常。所以我认为它的方法是定义方法返回字符串,然后动作过滤器在运行时将其更改为HttpResponse。

我有什么想法可以让它发挥作用吗?

这是在BeginRequest中添加的响应过滤器:

        HttpApplication app = (HttpApplication)sender;


        // Check the header to see if it can accept compressed output
        string encodings = app.Request.Headers.Get("Accept-Encoding");

        if (encodings == null)
            return;

        Stream s = app.Response.Filter;
        encodings = encodings.ToLower();

        if (encodings.Contains("gzip"))
        {
                app.Response.Filter = new GZipStream(s, CompressionMode.Compress);
                app.Response.AppendHeader("Content-Encoding", "gzip");
        }

1 个答案:

答案 0 :(得分:0)

不知道您正在做什么的具体细节,但我知道[BreezeController]属性会删除过滤器,只会添加微风所需的过滤器。

一种方法可能是定义仅提供元数据的单独控制器(ModelMetadataController)。该控制器没有[BreezeController]属性;它是一个普通的旧Web API控制器。

然后你创建一个" Breeze控制器" (ModelController)除了Metadata方法之外的所有常用方法。

您可以在应用启动期间通过MetadataStore.fetchMetadata从客户端调用元数据控制器,以获取元数据。

以这种方式填充metadataStore后,您可以在EntityManager中使用它,它会发送查询并将请求保存到"真实" Web API数据控制器。

客户端代码可能如下所示:

var ds = new breeze.DataService({
    serviceName: 'breeze/Model'   // the breeze query & save controller
});

var ms = new MetadataStore({
    namingConvention: breeze.NamingConvention.camelCase, // assuming that's what you want
});
ms.addDataService(ds); // associate the metadata-to-come with the "real" dataService

var manager = new breeze.EntityManager({
    dataService:   ds,
    metadataStore: ms
});

// the fun bit: fetch the metadata from a different controller
var promise = ms.fetchMetadata('breeze/ModelMetadata')  // the metadata-only controller!
return promise; // wait on it appropriately