2014-12-27 53 views
1

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

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

我已经做了一些测试,其中定义为返回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"); 
     } 

回答

0

不知道自己在做什么的具体细节,但我知道,[BreezeController]属性剔除了过滤器,并增加了回来只是那些微风想。

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

然后,使用除Metadata方法之外的所有常用方法创建“Breeze控制器”(ModelController)。

您只需通过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