SHDocVw InternetExplorer打印Serverside失败 - COM异常

时间:2012-09-14 10:56:17

标签: c# asp.net wcf printing shdocvw

我试图通过IIS机器上部署的WCF服务从服务器端打印文件。 以下代码完美地在Win 2oo3机器上运行。但是相同的代码抛出了COM异常。对此有任何想法。我猜它与某些权限有关。 这是代码

public void Print(string htmlFilename, string printer, short copies)
        {
            string currDefault = string.Empty;
            try
            {
                currDefault = GetDefaultPrinter();
                myPrinters.SetDefaultPrinter(printer);
                for (int i = 0; i < copies; i++)
                {
                    documentLoaded = false;
                    documentPrinted = false;

InternetExplorer  ie = new InternetExplorer  ();
                    ie.DocumentComplete += new SHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(ie_DocumentComplete);
                    ie.PrintTemplateTeardown += new SHDocVw.DWebBrowserEvents2_PrintTemplateTeardownEventHandler(ie_PrintTemplateTeardown);
                    object missing = Missing.Value;

                    ie.Navigate(htmlFilename, ref missing, ref missing, ref missing, ref missing);
                    while (!documentLoaded && ie.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_PRINT) != SHDocVw.OLECMDF.OLECMDF_ENABLED)
                        Thread.Sleep(100);


                    ie.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINTPREVIEW, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, ref missing, ref missing);

                    ie.ExecWB(SHDocVw.OLECMDID.OLECMDID_PRINT, SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER, ref missing, ref missing);
                    while (!documentPrinted)
                        Thread.Sleep(100);

                    ie.DocumentComplete -= ie_DocumentComplete;
                    ie.PrintTemplateTeardown -= ie_PrintTemplateTeardown;
                    ie.Quit();
                }
            }
            catch { throw; }
            finally
            {
                myPrinters.SetDefaultPrinter(currDefault);
            }
        }

在为internetexplorer创建对象时,Com Exception如下所示。

  

[ERRORLOG]检索具有CLSID的组件的COM类工厂   {0002DF01-0000-0000-C000-000000000046}由于以下原因而失败   错误:80080005服务器执行失败(来自HRESULT的异常:   0x80080005(CO_E_SERVER_EXEC_FAILURE))。 : 在   System.RuntimeTypeHandle.CreateInstance(RuntimeType类型,布尔值   publicOnly,Boolean noCheck,Boolean&amp; canBeCached,   RuntimeMethodHandleInternal&安培; ctor,布尔&amp; bNeedSecurityCheck)at   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly,Boolean   skipCheckThis,Boolean fillCache)at   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly,   Boolean skipVisibilityChecks,Boolean skipCheckThis,Boolean   fillCache)在System.Activator.CreateInstance(Type type,Boolean   System.Activator.CreateInstance(Type type)中的nonPublic)   [/ ERRORLOG]

此外,如果我尝试创建一个InternetExplorerMedium对象。然后它在2008年工作但不在Win server 2003中工作。我非常清楚......任何有关的帮助都会有所帮助。

此致 Pavan N

2 个答案:

答案 0 :(得分:1)

检查2003服务器和2008服务器上安装的IE版本。 此外,由于针对不同IE版本的不同IE安装,可能需要检查其他与IE版本相关的SDK运行时等,这些运行时等不在2008机器上。例如,我有一个较旧的客户端应用程序,我必须安装DHTMLEdit ActiveX工具包,这需要一个单独的步骤,你必须在MSDN上搜索设置例程。 还要检查2003和2008服务器(用于运行WCF服务的帐户)之间的帐户和权限,并查看不同之处。很多安全设置可能在2008年收紧了。

答案 1 :(得分:0)

最后我改变了自己的逻辑。我观察到很多不同之处。特别是IE9。所有的DCOM会都会有所不同。所以名称为InternetExplorer ie = new InternetExplorer();你不能创建任何对象。它与权限或操作系统无关。它与IE版本有关。以上代码仅适用于IE8。