【问题标题】:Writing or Copying File To Network Share in C#在 C# 中将文件写入或复制到网络共享
【发布时间】:2017-06-07 20:53:29
【问题描述】:

我编写了一个模拟会话 0 以访问本地打印机并将汇票打印到联网点阵打印机的 Windows 服务。这部分效果很好,想法是客户端(运行 3.5 桌面应用程序)将生成一个 xml 文件,该文件将写入(或复制,我不在乎)到该机器上的共享,以及打印队列服务每隔几秒钟就会捡起这些,按编号排序并存储,然后将作业发送到正确商店的打印机。一切正常。

但是我们的问题是,如果不先在每台计算机上保存凭据,我们就无法将 xml 文件保存到远程共享。尽管与每个对共享具有读/写/修改访问权限的人共享它,但它不起作用。显然,客户不愿意为 300 多台计算机输入用户名和密码。

我已经尝试了我能想到的一切。我尝试使用 WindowsIdentity 和 WindowsImpersonationContext 进行模拟,但我总是收到“提供的名称不是格式正确的帐户名称”。无论我使用 name@domain 或 domain\name,还是应用程序退出且事件查看器或我们的数据库中没有记录任何错误消息。我尝试使用找到的代码here 成功映射驱动器,但我被拒绝访问它。我已经尝试过使用 Windows API 中的 LogonUser 的替代代码(不起作用)。我已经用我能找到的限制最少的权限共享并重新共享了该文件夹。没有任何效果。

关于我们目前可以做什么的任何建议?代码在这里:

 foreach (MoneyOrderPrinterLineItem item in this.Lines)
        {
            string path = Globals.MoneyOrderPrintJobsPath + Globals.Store.StoreNameID.ToString("0#") +
                (Globals.DrawerContext.GetActiveDrawer()?.DrawerNameOnly) + Security.UserName + item.Number +
                DateTime.Now.ToString("MMddyyyy") + DateTime.Now.ToString("hhmmss") + ".xml";

            try
            {
                XmlWriterSettings settings = new XmlWriterSettings();
                settings.Indent = true;
                settings.Encoding = ASCIIEncoding.Unicode;


                //create a new file for each money order
                using (FileStream stream = new FileStream(path, FileMode.CreateNew))
                {
                    using (XmlWriter writer = XmlWriter.Create(stream, settings))
                    {
                        writer.WriteStartDocument();
                        writer.WriteStartElement("PrintJob");

                        writer.WriteStartElement("Source");
                        writer.WriteElementString("Name", Security.UserName);
                        writer.WriteElementString("Store", Globals.Store.StoreNameID.ToString("0#"));
                        writer.WriteElementString("StoreID", Globals.Store.ID.ToString());
                        writer.WriteElementString("Drawer", Globals.DrawerContext.GetActiveDrawer()?.DrawerNameOnly);
                        writer.WriteElementString("DateTime", DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString());
                        writer.WriteElementString("Machine", Environment.MachineName);
                        writer.WriteElementString("PrinterName", Globals.Store.MoneyOrderPrinter);
                        writer.WriteEndElement();

                        writer.WriteStartElement("Details");
                        writer.WriteElementString("Number", item.Number);
                        writer.WriteElementString("Payee", item.Payee);
                        writer.WriteElementString("Remitter", item.Remitter);
                        writer.WriteElementString("AmountDesc", item.AmountText);
                        writer.WriteElementString("Amount", item.Amount.ToString("F2"));
                        writer.WriteElementString("Fee", item.Fee.ToString("F2"));
                        writer.WriteElementString("BusinessDate", item.Date);
                        writer.WriteElementString("Notes", item.StoreNotes);
                        writer.WriteEndElement();

                        writer.WriteEndElement();
                        writer.WriteEndDocument();
                        writer.Close();
                    }
                }
            }
            catch (IOException ioEX)
            {
                Methods.ProcessException(ioEX, true);
            }
            catch (Exception ex)
            {
                Methods.ProcessException(ex, true);
            }
        }

所有机器都在同一个域中。全球汇票路径为\\WEB2012R2-DEV\MOPrints

【问题讨论】:

  • 客户端-服务器方式?在打印机上运行服务器,让客户端使用 HTTP 发送作业?
  • Dave S,这是个好主意。事实上,已经有一个 2.0 的 ASP.NET 网络服务在该机器上运行,允许与 3rd 方服务交互。我可以添加另一种方法 - 将 xml 发送给它,它会写入打印队列服务将拾取的文件。
  • 创建一个接受文件打印而不是依赖网络共享的网络服务?

标签: c# file networking printing io


【解决方案1】:

使用我们的网络服务将文件保存在本地的建议效果很好。谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多