Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9573
  • 博文数量: 1
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 20
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-12 12:15
文章分类
文章存档

2012年(1)

我的朋友
最近访客

分类: WINDOWS

2012-05-12 12:17:11

     如题。当保存一个带有GZIP压缩的网站页面时,有时候会射出如下异常:
“Invalid Syntax" (无效的语法)
     or
"Interface not registered" (接口未注册)

       这两个异常的罪魁祸首在于CDO依赖于URLMON.DLL。CDO使用URLMON.DLL来与页面打交道,外部调用会传入URL给URLMON进行处理,并等待它返回。这时有意思的事情开始了,URLMON.DLL通过异常方式来处理外部请求,因此它会开启一些工作线程去处理事务。当这些工作线程从服务器取回页面,并发现是GZIP-compressed的,它就会调用一个COM来解压缩这些内容。接下来。。大致你也能猜到吧。
    
       URLMON并未在工作线程上调用 CoInitialize,因此,当然程序就挂了。
       这两个异常是由两个不同的问题引起的。第一个异常是由于没有初始化COM,因此没有成功地创建IClassFactory interface;第二个异常是由于虽然初始化了COM,但并没有在特定的工作线程中初始化。

        知道了前因后果之后,解决问题的方法就比较多了,比如您是网站站长,您可以GZIP禁掉;又比如您可以把IE打开,关闭HTTP1.1(因为1.1允许压缩,但1.0不允许)。
   
        当然,做为一名的开发者,您肯定不屑这么干。
        那您应该比较感兴趣下面的代码,我以C#为例:
       
        private static int INTERNET_OPTION_HTTP_VERSION = 59;

        [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
        public struct INTERNET_VERSION_INFO
        {
            public int dwMajorVersion;
            public int dwMinorVersion;
        }
//        BOOL InternetSetOption(
//  __in  HINTERNET hInternet,
//  __in  DWORD dwOption,
//  __in  LPVOID lpBuffer,
//  __in  DWORD dwBufferLength
//);
        [DllImport("wininet.dll")]
        public extern static  bool InternetSetOption(IntPtr hInternet, int dwOption, ref INTERNET_VERSION_INFO lpBuffer, int dwBufferLength);

        public static bool DisableHttp1_1()
        {
            INTERNET_VERSION_INFO internetVersionInfo = new INTERNET_VERSION_INFO();
            internetVersionInfo.dwMajorVersion = 1;
            internetVersionInfo.dwMinorVersion = 0;

            int n = Marshal.SizeOf(internetVersionInfo);

            return InternetSetOption(IntPtr.Zero, INTERNET_OPTION_HTTP_VERSION, ref internetVersionInfo, Marshal.SizeOf(internetVersionInfo));
        }




  

阅读(2337) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~