如何让WCF客户端处理由IIS进行GZip或Defzed的服务器响应?
在IIS上,我按照这里的说明如何使IIS 6 gzip所有响应(其中请求包含"Accept-Encoding:gzip,deflate")由.svc wcf服务发出.
在客户端,我按照这里和这里的说明如何将此标头注入Web请求:"Accept-Encoding:gzip,deflate".
Fiddler2显示响应是二进制而不是普通的旧Xml.
客户端崩溃了一个异常,基本上说没有Xml标头,这是真的.
在我的IClientMessageInspector中,应用程序在调用AfterReceiveReply之前崩溃.
进一步说明:
(1)我无法更改WCF服务或客户端,因为它们是由第三方提供的.但是,如果这是正确的方向,我可以通过配置附加行为和/或消息检查器.
(2)我不想压缩/解压缩肥皂体,而是整个消息.
任何想法/解决方案?
*解决了*
无法编写WCF扩展来实现这些目标.相反,我遵循了CodeProject 主张辅助类的文章:
public class CompressibleHttpRequestCreator : IWebRequestCreate
{
public CompressibleHttpRequestCreator()
{
}
WebRequest IWebRequestCreate.Create(Uri uri)
{
HttpWebRequest httpWebRequest =
Activator.CreateInstance(typeof(HttpWebRequest),
BindingFlags.CreateInstance | BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance,
null, new object[] { uri, null }, null) as HttpWebRequest;
if (httpWebRequest == null)
{
return null;
}
httpWebRequest.AutomaticDecompression =DecompressionMethods.GZip |
DecompressionMethods.Deflate;
return httpWebRequest;
}
}
Run Code Online (Sandbox Code Playgroud)
此外,还添加了应用程序配置文件:
<configuration>
<system.net>
<webRequestModules>
<remove …Run Code Online (Sandbox Code Playgroud) 工厂类是静态的,而工厂方法也是静态的.
设计模式书中的GOF是否规定工厂及其方法必须是静态的,以满足模式的严格定义?
工厂+ /方法静态只是模式的结果吗?状态数据通常不由工厂类维护,因此它们通常是静态的.
调用所有AutoMapper大师!
我希望能够根据运行时的上下文以不同方式将对象A映射到对象B. 特别是,我想在一个映射的情况下忽略某些属性,并在另一个案例中映射所有属性.
我所经历的是Mapper.CreateMap可以在不同的映射情况下成功调用,但是,一旦调用了CreateMap,就会设置特定的一对类型的映射,并且随后的CreateMap调用不会改变它,这可能会描述映射不同.
我发现了一篇博客文章,主张使用Mapper.Reset()来解决问题,但是,Mapper类的静态特性意味着碰撞和崩溃发生只是时间问题.
有没有办法做到这一点?
我认为我需要的是每个appdomain调用Mapper.CreateMap一次,然后,能够调用Mapper.Map,提示应该包含/排除哪些属性.
现在,我正在考虑通过编写一个包含映射配置实例的非静态映射类来更改源代码.性能不佳,但线程安全.
我有什么选择.可以做些什么?Automapper似乎很有前途.
我在Windows Server 2008上运行用C#编写的.NET 4 Windows服务,在使用PerfMon监控时,每小时消耗2,500个句柄."Handle Count"计数器向上攀升.
当我使用ProcExp查看带有"显示未命名的句柄和映射"选项的句柄时,会列出数千个事件和信号量句柄.大多数人似乎都不知名.我查看了源代码,并没有明确使用AutoResetEvent或ManualResetEvent.
私人字节计数器爬升和下降.我没有看过这个过程超过几个小时,但会让它在一夜之间受到监控.
该服务在远程服务器上运行,因此我无法直接连接调试器,并且可能必须转储该进程并使用WinDBG或类似方法对其进行分析.
是否可以找到其中一个手柄并找出它指向的位置和/或可能"拥有"它的内容?如果是这样的话?
在回应评论时,这里是服务的功能摘要.
是否可以采用像NHibernate或Entity Framework这样的O/RM,并以一种可以在遇到O/RM无法处理的情况时替换它的方式对其进行抽象.
使用大块服务方法创建服务似乎很诱人,其中创建会话,会话用于获取/ upsert实体,然后用于保存所有脏对象.
我会考虑存储库模式,以便服务操作向存储库请求实体,并且O/RM会话嵌入在存储库中.但是你如何保存相关实体,并且Update(T实体)方法会立即刷新更改.它似乎很简单,而且通常不令人满意.
我现在倾向于使用单个O/RM包装器类,它使用诸如"StartSession","EndSession","AbandonSession","GetById(object id)"等通用方法公开接口.
至少这将允许OR/M在测试中伪造,这是我的另一个大问题.
我想我是说我不想密切交织业务逻辑和O/RM数据访问代码,因为切换到另一个O/RM可能会导致大部分代码被替换.
人们在现实世界中做了什么?
我想用于这样的连接:
Observable.forkJoin(
this.service1.dataSourceIsAReplaySubject,
this.service2.dataSourceIsAnObservable)
.subscribe(values => {
console.log('inside subscribe values is', values);
});
Run Code Online (Sandbox Code Playgroud)
但是console.log永远不会触发.
我猜测重播主题永远不会完成,这就是为什么forkJoin永远不会停止等待.
我试过这个,但这也行不通.我首先尝试了ReplaySubject,然后尝试了Observable,反之亦然.
Observable.forkJoin(
Observable.from(this.service1.dataSourceIsAReplaySubject),
this.service2.dataSourceIsAnObservable)
.subscribe(values => {
console.log('inside subscribe values is', values);
});
Run Code Online (Sandbox Code Playgroud)
我也试过调用share方法:
Observable.forkJoin(
this.service1.dataSourceIsAReplaySubject.share(),
this.service2.dataSourceIsAnObservable)
.subscribe(values => {
console.log('inside subscribe values is', values);
});
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能等待两个ReplaySubjects或1个ReplaySubject和1个Observable的混合
c# ×2
.net ×1
abstraction ×1
automapper ×1
gzip ×1
http-headers ×1
memory-leaks ×1
nhibernate ×1
observable ×1
rxjs ×1
testing ×1
wcf ×1
windows ×1