C# 如何在服务器上使用打印机

C# 如何在服务器上使用打印机,c#,C#,我从outlook下载.zip文件,然后将pdf文件发送到打印机。编译时,它在我的本地计算机上工作,但我在服务器上安装了已发布的应用程序,它从outlook下载.zip文件并打开,但无法发送到打印机。我怎么办 这是我的代码: static void Main(string[] args) { ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1); exchange.Cred

我从outlook下载.zip文件,然后将pdf文件发送到打印机。编译时,它在我的本地计算机上工作,但我在服务器上安装了已发布的应用程序,它从outlook下载.zip文件并打开,但无法发送到打印机。我怎么办

这是我的代码:

static void Main(string[] args)
{
    ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
    exchange.Credentials = new WebCredentials("mail@", "password");
    exchange.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");

    if (exchange != null)
    {
        SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
        FindItemsResults<Item> result = exchange.FindItems(WellKnownFolderName.Inbox, sf, new ItemView(1));

        foreach (Item item in result)
        {           
            EmailMessage message = EmailMessage.Bind(exchange, item.Id);

            message.IsRead = true;
            message.Update(ConflictResolutionMode.AutoResolve);

            List<Attachment> zipList = message.Attachments.AsEnumerable().Where(x => x.Name.Contains(".zip")).ToList();

            foreach (Attachment Attachment in zipList)
            {            
                if (Attachment is FileAttachment)
                {
                    FileAttachment f = Attachment as FileAttachment;

                    f.Load("C:\\TEST\\" + f.Name);

                    string zipPath = @"C:\TEST\" + f.Name;
                    string extractPath = @"C:\TEST\" + Path.GetRandomFileName();

                    ZipFile.ExtractToDirectory(zipPath, extractPath);

                    string[] filePaths = Directory.GetFiles(extractPath, "*.pdf",
                                 SearchOption.TopDirectoryOnly);

                    foreach (string path in filePaths)
                    {                      
                        SendToPrinter(path);
                    }
                }
            }
        }
    }
}



static void SendToPrinter(string path)
{
    try
    {              
        var printerName = "EPSON L310 Series";



            ProcessStartInfo info = new ProcessStartInfo(path);
            info.Verb = "PrintTo";
            info.UseShellExecute = false;
            info.CreateNoWindow = true;
            info.WindowStyle = ProcessWindowStyle.Hidden;
            info.Arguments = "\"" + printerName + "\"";
            Process p = new Process();
            p.StartInfo = info;
            p.Start();

            p.WaitForInputIdle();
            System.Threading.Thread.Sleep(3000);
            if (false == p.CloseMainWindow())
                p.Kill();
    }         
    catch (Exception ex)
    {              
        Console.WriteLine("error:", ex.Message);
        Console.ReadLine();
    }    
}
static void Main(字符串[]args)
{
ExchangeService exchange=新的ExchangeService(ExchangeVersion.Exchange2013\u SP1);
exchange.Credentials=新的WebCredentials(“邮件@”,“密码”);
exchange.Url=新的Uri(“https://outlook.office365.com/EWS/Exchange.asmx");
if(exchange!=null)
{
SearchFilter sf=new SearchFilter.SearchFilterCollection(LogicalOperator.And,new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead,false));
FindItemsResults=exchange.FindItems(WellKnownFolderName.Inbox,sf,new ItemView(1));
foreach(结果中的项目)
{           
EmailMessage=EmailMessage.Bind(exchange,item.Id);
message.IsRead=true;
message.Update(ConflictResolutionMode.AutoResolve);
列出您需要更改的内容:

info.UseShellExecute = false;
致:

因为
路径
是PDF文件的路径,而不是可执行文件

根据:

当您使用操作系统外壳启动进程时,您可以 启动任何文档(与之关联的任何已注册文件类型) 具有默认打开操作)并执行操作的可执行文件 在文件上,例如打印,使用进程对象。当 UseShellExecute为false,您只能使用 进程对象

此外:

如果将WindowsStyle设置为ProcessWindowsStyle.Hidden, UseShellExecute必须设置为true


您正在使用
Hidden
-因此
UseShellExecute
必须是
true

,因此您可以在服务器上运行此代码,我可以假设您已经检查了“EPSON L310系列”打印机是否在那里可用吗?它在那里可用我知道,因为在服务器上,我可以使用“EPSON L310系列”手动打印@Steven当应用程序在服务器上运行时,它在哪个用户帐户下运行?作为管理员@IANMercerpress,请更新问题以显示
路径的确切值(从
监视
即时窗口
)。这似乎是合理的,但为什么应用程序在本地工作?有时在某些情况下,做错误的事情是有效的。这并不意味着这样做是正确的。文档是权威。
info.UseShellExecute = true;