我有一个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");
}
答案 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