如题。当保存一个带有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) |