从运行localhost的ASP.NET Web应用程序打开Powerpoint演示文稿



我正在尝试从.NET MVC Web应用程序执行Powerpoint演示。我使用office.interop.powerpoint库,在使用VisualStudio时一切都很好。但是,如果我在IISExpress服务器中部署web应用程序(而不是在VS中),Powerpoint应用程序不会作为最顶层的窗口打开,它也不会正常工作,如果我将其部署在IIS服务器中,Powerpoint根本不会启动。

我知道问题出在IISUSR凭据上,因为我(作为一个web应用程序)没有执行应用程序的权限。

问题是:有没有一种方法可以使用互操作库以不同用户的身份启动Powerpoint应用程序?我知道用"ProcessStartInfo"以不同用户的身份启动一个新流程是可能的,但如果我这样做,我应该为我需要打开的每个演示执行一个Powerpoint流程,我就无法访问演示的控件,比如nextSlide等等……我的想法是执行一次Powerpoint,然后打开、关闭和控制许多演示。

我现在拥有的代码:

启动Powerpoint应用程序(执行一次):

app = new Application();
app.Visible = MsoTriState.msoTrue;
app.PresentationClose += ClosePPT;
app.Activate();
app.WindowState = PpWindowState.ppWindowMinimized;
ppts = app.Presentations;

打开新演示文稿:

public void LoadPPT(string pptPath)
{
try
{
//Close all opened presentations if any
if (ppts.Count > 0)
foreach (Presentation p in ppts)
p.Close();
//Open new presentation
ppt = ppts.Open(pptPath, MsoTriState.msoTrue, MsoTriState.msoFalse, MsoTriState.msoFalse);
SlideShowSettings sss = ppt.SlideShowSettings;
sss.Run();
while (app.SlideShowWindows.Count <= 0) ;
SlideShowWindow ssw = ppt.SlideShowWindow;
ssw.Activate();
//if (!SetWindowPos((IntPtr)ssw.HWND, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW))
//{
//    int error = Marshal.GetLastWin32Error();
//    NLog.LogManager.GetCurrentClassLogger().Debug("Error " + error);
//}
ssv = ssw.View;
}
catch (Exception e)
{
NLog.LogManager.GetCurrentClassLogger().Debug("Excepcion en PPT. " + e.Message);
while (e.InnerException != null)
{
NLog.LogManager.GetCurrentClassLogger().Debug("INNER. " + e.InnerException.Message);
e = e.InnerException;
}
}
}

正如您所看到的,我还尝试使用Win32"SetWindowPos"将幻灯片演示的窗口设置在最顶部的位置,但结果相同。

我正在尝试从.NET MVC Web应用程序执行Powerpoint演示。我正在使用office.interop.powerpoint库

Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP、ASP.NET、DCOM和NT服务)自动化Microsoft Office应用程序,因为在这种环境中运行Office时,Office可能会表现出不稳定的行为和/或死锁。

如果您正在构建一个在服务器端上下文中运行的解决方案,则应该尝试使用那些可以安全执行无人参与的组件。或者,您应该尝试找到至少允许部分代码运行客户端的替代方案。如果使用服务器端解决方案中的Office应用程序,则该应用程序将缺乏成功运行所需的许多功能。此外,您将在整体解决方案的稳定性方面承担风险。请参阅"Office服务器端自动化的注意事项"一文中的更多内容。

您可以考虑使用任何为服务器端执行而设计的第三方组件(可以承载PowerPoint演示文稿的ASP.NET控件)。

相关内容

最新更新