tnblog
首页
视频
资源
登录

通过Windows服务进行FTP与服务器之间文件的传输

4262人阅读 2019/6/20 17:35 总访问:82547 评论:1 收藏:0 手机
分类: FTP_NPOI

                  这几天做了一个关于FTP与服务器之间文件互相传输的Windows服务,本地开发的时候非常顺利,很快就开发完成了,可是将服务部署到服务器上的时候,却出现了许多的意外,让人防不胜防,今天就总结一下我在工作过程中遇到的问题。

          

                  先上我的代码吧,然后再讲解(代码主要是记录给我自己看的,可以直接跳过看问题):

                  1.这是Program.cs文件的代码:

  1. using System.ServiceProcess;
  2. namespace ECI.SW.HandleStorageMessageService
  3. {
  4.     static class Program
  5.     {
  6.         /// <summary>
  7.         /// 应用程序的主入口点。
  8.         /// <author>Asa</author>
  9.         /// <createDate>2019/06/20</createDate>
  10.         /// </summary>
  11.         static void Main()
  12.         {
  13.             ServiceBase[] ServicesToRun;
  14.             ServicesToRun = new ServiceBase[]
  15.             {
  16.                 // 实例化我的服务类
  17.                 new HandleStorageMessageService()
  18.             };
  19.             
  20.             // 运行服务类
  21.             ServiceBase.Run(ServicesToRun);
  22.             #region test code begin
  23.             // 控制台方式调用服务类中的方法
  24.             // ServiceExcute.GygHandleMessage();
  25.             #endregion test code end
  26.         }
  27.     }
  28. }

            2.HandleStorageMessageService类中的代码

  1. using ECI.SW.HandleStorageMessageService.Model;
  2. using NPOI.HSSF.UserModel;
  3. using NPOI.SS.UserModel;
  4. using NPOI.XSSF.UserModel;
  5. using PL.Base;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.IO;
  10. using System.ServiceProcess;
  11. using System.Text;
  12. using System.Timers;
  13. using System.Xml;
  14. namespace ECI.SW.HandleStorageMessageService
  15. {
  16.     /// <summary>
  17.     /// 电子口岸发送企业集装箱堆场数据服务
  18.     /// <author>Asa</author>
  19.     /// <createDate>2019/06/13</createDate>
  20.     /// </summary>
  21.     public partial class HandleStorageMessageService : ServiceBase
  22.     {
  23.         /// <summary>
  24.         /// 构造函数
  25.         /// <author>Asa</author>
  26.         /// <createDate>2019/06/20</createDate>
  27.         /// </summary>
  28.         public HandleStorageMessageService()
  29.         {
  30.             InitializeComponent();
  31.         }
  32.         /// <summary>
  33.         /// 服务启动时执行
  34.         /// <author>Asa</author>
  35.         /// <createDate>2019/06/20</createDate>
  36.         /// </summary>
  37.         /// <param name="args">args</param>
  38.         protected override void OnStart(string[] args)
  39.         {
  40.                 // 控制台方式调试时注释掉
  41.             //ServiceExcute.Init();
  42.         }
  43.         /// <summary>
  44.         /// 服务停止时执行
  45.         /// <author>Asa</author>
  46.         /// <createDate>2019/06/20</createDate>
  47.         /// </summary>
  48.         protected override void OnStop()
  49.         {
  50.         }
  51.     }
  52.     /// <summary>
  53.     /// 处理堆场信息
  54.     /// <author>Asa</author>
  55.     /// <createDate>2019/06/14</createDate>
  56.     /// </summary>
  57.     public class ServiceExcute
  58.     {
  59.         // 定义一个定时器(控制台方式调试时注释掉)
  60.         private static Timer timer;
  61.         /// <summary>
  62.         /// 初始化定时器(控制台方式调试时注释掉)
  63.         /// <author>Asa</author>
  64.         /// <createDate>2019/06/14</createDate>
  65.         /// </summary>
  66.         public static void Init()
  67.         {
  68.             try
  69.             {
  70.                 // 数据来源
  71.                 string DataSource = EciConfig.Read("DataSource");
  72.                 // timer执行间隔时间
  73.                 int seconds = Convert.ToInt32(EciConfig.Read("ReadFileTime")) * 60000;
  74.                 timer = new Timer(seconds);
  75.                 if (DataSource.Equals("GYG"))
  76.                 {
  77.                     timer.Elapsed += new ElapsedEventHandler(GygHandleMessage);
  78.                 }
  79.                 // 是否使用定时器
  80.                 timer.Enabled = true;
  81.             }
  82.             catch (Exception ex)
  83.             {
  84.                 Log.Write("init出错:" + ex.Message, "initCatch");
  85.             }
  86.         }
  87.         /// <summary>
  88.         /// 果园港(Gyg)堆场数据文件处理 object sender, EventArgs e
  89.         /// <author>Asa</author>
  90.         /// <createDate>2019/06/14</createDate>
  91.         /// </summary>
  92.         /// <param name="sender">sender</param>
  93.         /// <param name="e">e</param>
  94.         public static void GygHandleMessage(object sender, EventArgs e)
  95.         {
  96.             try
  97.             {
  98.                     // 字母转ASCII码,这里不需要 
  99.                 // AlphabetToNumber();
  100.                 
  101.                 #region 读取配置信息,声明必要的对象--BEGIN(这里因为我需要将读取的Excel转为XML保存到服务器,所以配置了很多地址,按自己需要配置)
  102.                 // 读取FTP访问地址
  103.                 string ftpPath = EciConfig.Read("ftpPath");
  104.                 // 读取ftp访问用户名
  105.                 string userName = EciConfig.Read("userName");
  106.                 // 读取ftp访问密码
  107.                 string pwd = EciConfig.Read("pwd");
  108.                 // 读取excel文件保存的路径
  109.                 string saveExcelFilePath = EciConfig.Read("saveExcelFilePath");
  110.                 // 读取xml文件保存的路径
  111.                 string saveXmlFilePath = EciConfig.Read("saveXmlFilePath");
  112.                 // 读取单一窗口服务器上回执报文保存的地址
  113.                 string readXmlFilePath = EciConfig.Read("readXmlFilePath");
  114.                 // 读取sheetname
  115.                 string sheetName = EciConfig.Read("sheetName");
  116.                 // 实例化一个Datatable对象接收Excel转换的Datatable(这里顺便可以学习npoi读取Excel并转Datatable的方法)
  117.                 DataTable excelDt = new DataTable();
  118.                 #endregion 读取配置信息,声明必要的对象--END
  119.                 #region 处理堆场数据--BEGIN
  120.                 // 连接FTP,这里使用了一个我的FTPhelper类,等会儿会贴上来
  121.                 Common.FTP.FtpHelper ftpHelper = new Common.FTP.FtpHelper(ftpPath, "", userName, pwd);
  122.                 // 获取FTP上的文件列表
  123.                 string[] fileNameArray = ftpHelper.GetFileList("");
  124.                 // 判断文件列表是否为空
  125.                 if (fileNameArray != null)
  126.                 {
  127.                     // 遍历文件列表,从FTP服务器下载对应文件
  128.                     foreach (string fileName in fileNameArray)
  129.                     {
  130.                         #region 判断是否是Excel文件
  131.                         // 获取文件拓展名
  132.                         string extensionName = fileName.Substring(fileName.LastIndexOf("."));
  133.                         // 获取文件名
  134.                         string fileNameNoExtension = fileName.Substring(0, fileName.LastIndexOf("."));
  135.                         // 判断文件是否是Excel文件
  136.                         if (!extensionName.Equals(".xls") && !extensionName.Equals(".xlsx"))
  137.                         {
  138.                             continue;
  139.                         }
  140.                         #endregion
  141.                         #region 下载堆场数据Excel文件--BEGIN
  142.                         // 判断保存Excel文件的路径是否存在,如果不存在就创建该地址
  143.                         if (!Directory.Exists(saveExcelFilePath))
  144.                             Directory.CreateDirectory(saveExcelFilePath);
  145.                         // 判断文件是否已下载,如果已下载则跳过
  146.                         if (File.Exists(saveExcelFilePath + "/" + fileName))
  147.                             continue;
  148.                         // 根据文件名下载文件
  149.                         ftpHelper.Download(saveExcelFilePath, fileName);
  150.                         #endregion 下载堆场数据Excel文件--END
  151.                         #region 处理堆场数据Excel文件(这一块是我对读取到的FTP文件做的我自己的业务需求处理,可以不看)--BEGIN
  152.                         #region XML头信息实体--BEGIN
  153.                         // 当前时间
  154.                         DateTime datetimeNow = DateTime.Now;
  155.                         // 报文编码
  156.                         string msgId = "01" + "CNCQI800028" + datetimeNow.ToString("yyyyMMddHHmmssfff");
  157.                         // 实例化XML头实体对象
  158.                         SwStorageMessageHead swStorageMessageHead = new SwStorageMessageHead();
  159.                         // 报文编码
  160.                         swStorageMessageHead.MSG_ID = msgId;
  161.                         // 报文类型
  162.                         swStorageMessageHead.MSG_TYPE = "CSA01";
  163.                         // 关卡代码
  164.                         swStorageMessageHead.CUSTOMS_CODE = "8007";
  165.                         // 作业场所编号
  166.                         swStorageMessageHead.SUPV_LOCT_CODE = "CNCQI800028";
  167.                         // 报文发送时间
  168.                         swStorageMessageHead.DECL_DATE = datetimeNow.ToString();
  169.                         // 申报数据类型
  170.                         swStorageMessageHead.DECLARE_DATE_TYPE = "0";
  171.                         // 申报数据报文总数
  172.                         swStorageMessageHead.TOTAL_MSG_NO = "1";
  173.                         // 当前报文序号
  174.                         swStorageMessageHead.CUR_MSG_NO = "1";
  175.                         // 堆场信息XML文件头数据插入SQL语句
  176.                         StringBuilder insertHeadBuilder = new StringBuilder();
  177.                         BuildHeadInsertSql(insertHeadBuilder, swStorageMessageHead);
  178.                         try
  179.                         {
  180.                             // 初始化connectionstring连接字符串对象
  181.                             EciServer.InitFramework();
  182.                             // 插入XML头数据
  183.                             DBHelper.ExecuteNoneQuery(insertHeadBuilder.ToString());
  184.                         }
  185.                         catch (Exception ex)
  186.                         {
  187.                             Log.Write("SwStorageMessageHead插入失败:" + ex.Message, "InsertErr");
  188.                         }
  189.                         #endregion XML头信息实体--END
  190.                         #region XML基础信息写入--BEGIN
  191.                         // 实例化一个操作XML文件的对象
  192.                         XmlDocument xmldoc = new XmlDocument();
  193.                         // 实例化一个填写版本等信息的XML节点对象(创建具有指定值的xmldeclaration节点)
  194.                         XmlNode versionNode = xmldoc.CreateXmlDeclaration("1.0""UTF-8""");
  195.                         // 将指定的节点添加到子节点列表的末尾
  196.                         xmldoc.AppendChild(versionNode);
  197.                         // 创建xmldocument中的单个节点(根节点)
  198.                         XmlNode rootNode = xmldoc.CreateElement("ContaDeclareInfo");
  199.                         // 将根节点添加到子节点列表的末尾
  200.                         xmldoc.AppendChild(rootNode);
  201.                         #endregion XML基础信息写入--END
  202.                         #region xml信息写入--BEGIN
  203.                         // 创建XML头节点
  204.                         CreateHeadNode(xmldoc, rootNode, swStorageMessageHead);
  205.                         // 创建XML--Declaratioin节点
  206.                         XmlNode declareationNode = xmldoc.CreateNode(XmlNodeType.Element, "Declaratioin"null);
  207.                         try
  208.                         {
  209.                             // 调用读取Excel转换为Datatable的方法
  210.                             excelDt = ReadExcelToDataTable(saveExcelFilePath + "\\" + fileName, sheetName);
  211.                         }
  212.                         catch (Exception dtEx)
  213.                         {
  214.                             Log.Write("Excel转换为Datatable出错:" + dtEx.Message, "ToDatatableErr");
  215.                         }
  216.                         if (excelDt != null && excelDt.Rows.Count > 0)
  217.                             // 执行数据插入list表并生成对应Declaratioin--XML节点
  218.                             InsertListDbAndCreateListXmlExecute(excelDt, msgId, xmldoc, declareationNode);
  219.                         // 将Declaratioin节点添加到根节点
  220.                         rootNode.AppendChild(declareationNode);
  221.                         #endregion xml信息写入--END
  222.                         #region 保存创建的XML文件--BEGIN
  223.                         try
  224.                         {
  225.                             xmldoc.Save(saveXmlFilePath + "\\" + fileNameNoExtension + ".xml");
  226.                         }
  227.                         catch (Exception ex)
  228.                         {
  229.                             Log.Write("保存xml文件失败:" + ex.Message, "saveXmlErr");
  230.                         }
  231.                         #endregion 保存创建的XML文件--END
  232.                         #endregion 处理堆场数据Excel文件--END
  233.                     }
  234.                 }
  235.                 #endregion 处理堆场数据--END
  236.                 // 处理回执报文信息
  237.                 HandleResponseXml(readXmlFilePath, ftpHelper);
  238.             }
  239.             catch (Exception ex)
  240.             {
  241.                 Log.Write("UnExpectedError:" + ex.Message, "UnExpectedError");
  242.             }
  243.         }
  244.          // 这下面都是我的工具方法,可以不看
  245.         // 字母转换为ASCII码数字
  246.         public static string AlphabetToNumber()
  247.         {
  248.             byte[] array = new byte[1]; //定义一组数组array
  249.             array = Encoding.ASCII.GetBytes("E"); //string转换的字母
  250.             int asciicode = (short)(array[0]);
  251.             string ascii = Convert.ToString(asciicode); //将转换一的ASCII码转换成string型
  252.             return ascii;
  253.         }
  254.         /// <summary>
  255.         /// 读取Excel文件并转化为Datatable
  256.         /// <author>Asa</author>
  257.         /// <createDate>2019/06/20</createDate>
  258.         /// </summary>
  259.         /// <param name="filePath">文件地址</param>
  260.         /// <param name="sheetname">sheet名称</param>
  261.         /// <returns></returns>
  262.         public static DataTable ReadExcelToDataTable(string filePath, string sheetname)
  263.         {
  264.             #region 实例化必要的对象--BEGIN
  265.             // 声明一个IWorkbook对象
  266.             IWorkbook workbook = null;
  267.             // 实例化一个ISheet对象,用来接收读取到的sheet
  268.             ISheet sheet = null;
  269.             // 实例化一个Datatable对象
  270.             DataTable dt = new DataTable();
  271.             // 判断文件是否存在,不存在返回空
  272.             if (!File.Exists(filePath))
  273.                 return null;
  274.             // 将读取到的文件转为文件流
  275.             FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
  276.             #endregion 实例化必要的对象--END
  277.             #region 根据Excel文件的版本使用不同的IWorkbook对象--BEGIN
  278.             // 判断读取到的Excel文件的版本
  279.             if (filePath.IndexOf(".xlsx") > 0)
  280.             {
  281.                 // 2007版本
  282.                 workbook = new XSSFWorkbook(fs);
  283.             }
  284.             else if (filePath.IndexOf(".xls") > 0)
  285.             {
  286.                 // 2003版本
  287.                 workbook = new HSSFWorkbook(fs);
  288.             }
  289.             #endregion 根据Excel文件的版本使用不同的IWorkbook对象--END
  290.             // 接收读取到的sheet
  291.             sheet = workbook.GetSheet(sheetname);
  292.             #region 对sheet表进行处理==>转换为Datatable--BEGIN
  293.             var rows = sheet.GetRowEnumerator();
  294.             while (rows.MoveNext())
  295.             {
  296.                 IRow row = rows.Current as IRow;
  297.                 if (row.RowNum == 0)
  298.                 {
  299.                     row.Cells.ForEach(cell =>
  300.                     {
  301.                         dt.Columns.Add(cell.StringCellValue);
  302.                     });
  303.                 }
  304.                 else
  305.                 {
  306.                     var dr = dt.NewRow();
  307.                     for (int i = 0; i < row.Cells.Count; i++)
  308.                     {
  309.                         dr[i] = row.Cells[i].ToString();
  310.                     }
  311.                     dt.Rows.Add(dr);
  312.                 }
  313.             }
  314.             #endregion 对sheet表进行处理==>转换为Datatable--END
  315.             return dt;
  316.         }
  317.         /// <summary>
  318.         /// 处理回执报文
  319.         /// <author>Asa</author>
  320.         /// <createDate>2019/06/19</createDate>
  321.         /// </summary>
  322.         /// <param name="readXmlFilePath">读取回执报文的路径</param>
  323.         /// <param name="fileNameArray">FTP服务器上现有的文件名列表</param>
  324.         /// <param name="ftpHelper">FTP工具类对象</param>
  325.         public static void HandleResponseXml(string readXmlFilePath, Common.FTP.FtpHelper ftpHelper)
  326.         {
  327.             // 获取文件列表
  328.             string[] fileNameArr = ftpHelper.GetFileList("");
  329.             // 读取所有的回执报文XML文件
  330.             DirectoryInfo receiptXmlList = new DirectoryInfo(readXmlFilePath);
  331.             // 遍历文件列表,获取XML文件
  332.             foreach (FileInfo receiptXml in receiptXmlList.GetFiles("*.xml"))
  333.             {
  334.                 // 实例化一个XML操作对象
  335.                 XmlDocument xmldoc = new XmlDocument();
  336.                 // 通过URL加载XML文件
  337.                 xmldoc.Load(receiptXml.FullName);
  338.                 // 定义一个标记判断报文是否已存在
  339.                 bool isExists = false;
  340.                 #region 上传读取的回执XML文件--BEGIN
  341.                 try
  342.                 {
  343.                     // 遍历FTP文件列表
  344.                     foreach (string fileName in fileNameArr)
  345.                     {
  346.                         // 判断回执报文是否已存在,已存在则不上传
  347.                         if (fileName.Equals(receiptXml.Name))
  348.                         {
  349.                             isExists = true;
  350.                             break;
  351.                         }
  352.                     }
  353.                     // 如果回执报文不存在,则上传
  354.                     if (!isExists)
  355.                         ftpHelper.Upload(receiptXml.FullName);
  356.                     else
  357.                         continue;
  358.                 }
  359.                 catch (Exception ex)
  360.                 {
  361.                     Log.Write("上传xml回执文件失败:" + ex.Message, "saveXmlErr");
  362.                 }
  363.                 #endregion 上传读取的回执XML文件--END
  364.                 #region 回执报文数据入库--BEGIN
  365.                 #region 获取回执报文XML节点--BEGIN
  366.                 // 报文编码
  367.                 XmlNode msgId = xmldoc.SelectSingleNode("//MsgId");
  368.                 // 报文类型
  369.                 XmlNode msgType = xmldoc.SelectSingleNode("//MsgType");
  370.                 // 关卡代码
  371.                 XmlNode customsCode = xmldoc.SelectSingleNode("//CustomsCode");
  372.                 // 作业场所编码
  373.                 XmlNode supvLoctCode = xmldoc.SelectSingleNode("//SupvLoctCode");
  374.                 // 报文发送时间
  375.                 XmlNode declDate = xmldoc.SelectSingleNode("//DeclDate");
  376.                 // 回执结果
  377.                 XmlNode result = xmldoc.SelectSingleNode("//Result");
  378.                 // 备注信息
  379.                 XmlNode remark = xmldoc.SelectSingleNode("//Remark");
  380.                 #endregion 回执报文数据入库--END
  381.                 #region 回执报文表头实体赋值--BEGIN
  382.                 // 回执报文表头实体赋值
  383.                 SwStorageResponseHead swStorageResponseHead = new SwStorageResponseHead();
  384.                 swStorageResponseHead.MSG_ID = msgId.InnerText;
  385.                 swStorageResponseHead.MSG_TYPE = msgType.InnerText;
  386.                 swStorageResponseHead.CUSTOMS_CODE = customsCode.InnerText;
  387.                 swStorageResponseHead.SUPV_LOCT_CODE = supvLoctCode.InnerText;
  388.                 swStorageResponseHead.DECL_DATE = declDate.InnerText;
  389.                 // 实例化一个stringbuilder对象用来拼接表头插入语句
  390.                 StringBuilder insertResponseHeadBuilder = new StringBuilder();
  391.                 BuildResponseHeadInserSql(insertResponseHeadBuilder, swStorageResponseHead);
  392.                 #endregion 回执报文表头实体赋值--END
  393.                 #region 执行回执报文表头数据入库--BEGIN
  394.                 try
  395.                 {
  396.                     // 初始化connectionstring连接字符串对象
  397.                     EciServer.InitFramework();
  398.                     // 插入XML头数据
  399.                     DBHelper.ExecuteNoneQuery(insertResponseHeadBuilder.ToString());
  400.                 }
  401.                 catch (Exception ex)
  402.                 {
  403.                     Log.Write("SwStorageResponseHead插入失败:" + ex.Message, "InsertErr");
  404.                 }
  405.                 #endregion 执行回执报文表头数据入库--END
  406.                 #region 回执报文表体实体赋值--BEGIN
  407.                 // 回执报文表体赋值
  408.                 SwStorageResponseList swStorageResponseList = new SwStorageResponseList();
  409.                 swStorageResponseList.MSG_ID = msgId.InnerText;
  410.                 swStorageResponseList.RESULT = result.InnerText;
  411.                 swStorageResponseList.REMARK = remark.InnerText;
  412.                 // 实例化一个stringbuilder对象拼接表体插入语句
  413.                 StringBuilder insertResponseListBuilder = new StringBuilder();
  414.                 BuildResponseListInserSql(insertResponseListBuilder, swStorageResponseList);
  415.                 #endregion 回执报文表体实体赋值--END
  416.                 #region 执行回执报文表体数据入库--BEGIN
  417.                 try
  418.                 {
  419.                     // 初始化connectionstring连接字符串对象
  420.                     EciServer.InitFramework();
  421.                     // 插入XML头数据
  422.                     DBHelper.ExecuteNoneQuery(insertResponseListBuilder.ToString());
  423.                 }
  424.                 catch (Exception ex)
  425.                 {
  426.                     Log.Write("SwStorageResponseList插入失败:" + ex.Message, "InsertErr");
  427.                 }
  428.                 #endregion 执行回执报文表体数据入库--END
  429.                 #endregion 回执报文数据入库--END
  430.             }
  431.         }
  432.         /// <summary>
  433.         /// 执行数据插入list表并生成对应Declaratioin--XML节点
  434.         /// <author>Asa</author>
  435.         /// <createDate>2019/06/18</createDate>
  436.         /// </summary>
  437.         /// <param name="ds">读取Excel生成的dataset</param>
  438.         /// <param name="msgId">报文编码</param>
  439.         /// <param name="xmldoc">xmldocument对象</param>
  440.         /// <param name="declareationNode">Declaratioin节点</param>
  441.         public static void InsertListDbAndCreateListXmlExecute(DataTable excelDt, string msgId, XmlDocument xmldoc, XmlNode declareationNode)
  442.         {
  443.             // 遍历dataset,读取Excel中的堆场数据并存入表中
  444.             for (int i = 3; i < excelDt.Rows.Count; i++)
  445.             {
  446.                 #region XML数据信息实体--BEGIN
  447.                 SwStorageMessageList swStorageMessageList = new SwStorageMessageList();
  448.                 // 报文编码
  449.                 swStorageMessageList.MSG_ID = msgId;
  450.                 // 集装箱号
  451.                 swStorageMessageList.CONTA_ID = excelDt.Rows[i][4].ToString();
  452.                 // 判断是否是列名,如果是列名就跳过这一行
  453.                 if (swStorageMessageList.CONTA_ID.Equals("箱号") || swStorageMessageList.CONTA_ID.NullOrEmpty())
  454.                     continue;
  455.                 // 集装箱尺寸
  456.                 swStorageMessageList.CONTA_TYPE_CODE = excelDt.Rows[i][5].ToString();
  457.                 // 箱位代码
  458.                 swStorageMessageList.SEAT = excelDt.Rows[i][15].ToString();
  459.                 // 将箱位代码转换为正确的格式
  460.                 swStorageMessageList.SEAT = swStorageMessageList.SEAT.Replace("-""/0");
  461.                 #region 内外贸标识--BEGIN
  462.                 swStorageMessageList.TRADE_MARK = excelDt.Rows[i][2].ToString();
  463.                 if (swStorageMessageList.TRADE_MARK.Equals("内贸"))
  464.                     swStorageMessageList.TRADE_MARK = "D";
  465.                 else if (swStorageMessageList.TRADE_MARK.Equals("外贸"))
  466.                     swStorageMessageList.TRADE_MARK = "I";
  467.                 else
  468.                     swStorageMessageList.TRADE_MARK = "O";
  469.                 #endregion 内外贸标识--END
  470.                 #region 进出口标识--BEGIN
  471.                 swStorageMessageList.IE_FLAG = excelDt.Rows[i][10].ToString();
  472.                 if (swStorageMessageList.IE_FLAG.Equals("进口"))
  473.                     swStorageMessageList.IE_FLAG = "I";
  474.                 else if (swStorageMessageList.IE_FLAG.Equals("出口"))
  475.                     swStorageMessageList.IE_FLAG = "E";
  476.                 #endregion 进出口标识--END
  477.                 // 拼箱状态
  478.                 swStorageMessageList.CONTA_MARK = "";
  479.                 // 装载状态
  480.                 swStorageMessageList.LOAD_MARK = excelDt.Rows[i][7].ToString();
  481.                 // 危品柜状态
  482.                 swStorageMessageList.DANGER_MARK = "";
  483.                 // 进场时间
  484.                 swStorageMessageList.ENTRANCE_DATE = excelDt.Rows[i][23].ToString();
  485.                 // 出场时间
  486.                 swStorageMessageList.DEPART_TRUE_DATE = "";
  487.                 // 当前状态
  488.                 swStorageMessageList.WORK_MARK = "A";
  489.                 // 数据处理标识
  490.                 swStorageMessageList.DATA_DEAL_FLAG = "A";
  491.                 // 提单号
  492.                 swStorageMessageList.BILL_NO = excelDt.Rows[i][14].ToString();
  493.                 // 报关单号
  494.                 swStorageMessageList.ENTRY_ID = "";
  495.                 // 转关单号
  496.                 swStorageMessageList.PRE_NO = "";
  497.                 // 多式联运单号
  498.                 swStorageMessageList.MT_APPLY_NO = "";
  499.                 // 备注
  500.                 swStorageMessageList.REMARK = "备注信息";
  501.                 // 计划状态
  502.                 swStorageMessageList.PLAN_STATUS = excelDt.Rows[i][1].ToString();
  503.                 // 是否中转
  504.                 swStorageMessageList.IS_TRANSFER = excelDt.Rows[i][3].ToString();
  505.                 // 箱型
  506.                 swStorageMessageList.CONTA_TYPE = excelDt.Rows[i][6].ToString();
  507.                 // 箱货类
  508.                 swStorageMessageList.CONTA_GOODS_TYPE = excelDt.Rows[i][8].ToString();
  509.                 // 货柜
  510.                 swStorageMessageList.CONTAINER = excelDt.Rows[i][9].ToString();
  511.                 // 箱主
  512.                 swStorageMessageList.CONTA_OWNER = excelDt.Rows[i][11].ToString();
  513.                 // 船公司
  514.                 swStorageMessageList.BOAT_COMPANY = excelDt.Rows[i][12].ToString();
  515.                 // 代理公司
  516.                 swStorageMessageList.AGENT_COMPANY = excelDt.Rows[i][13].ToString();
  517.                 // 铅封
  518.                 swStorageMessageList.LEAD_SEALING = excelDt.Rows[i][16].ToString();
  519.                 // 破损说明
  520.                 swStorageMessageList.DAMAGE_DESCRIPTION = excelDt.Rows[i][17].ToString();
  521.                 // 破损代码
  522.                 swStorageMessageList.DAMAGE_CODE = excelDt.Rows[i][18].ToString();
  523.                 // 进口船名
  524.                 swStorageMessageList.I_BOAT_NAME = excelDt.Rows[i][19].ToString();
  525.                 // 进口航次
  526.                 swStorageMessageList.I_BOAT_VOYAGENO = excelDt.Rows[i][20].ToString();
  527.                 // 出口船名
  528.                 swStorageMessageList.E_BOAT_NAME = excelDt.Rows[i][21].ToString();
  529.                 // 出口航次
  530.                 swStorageMessageList.E_BOAT_VOYAGENO = excelDt.Rows[i][22].ToString();
  531.                 // 堆存天
  532.                 swStorageMessageList.STORAGE_DATE = excelDt.Rows[i][24].ToString();
  533.                 // 货名
  534.                 swStorageMessageList.GOODS_NAME = excelDt.Rows[i][25].ToString();
  535.                 // 总重
  536.                 swStorageMessageList.TOTAL_WEIGHT = excelDt.Rows[i][26].ToString();
  537.                 // 货重
  538.                 swStorageMessageList.GOODS_WEIGHT = excelDt.Rows[i][27].ToString();
  539.                 // 堆场表体数据插入SQL语句
  540.                 StringBuilder insertBodyBuilder = new StringBuilder();
  541.                 BuildListInsertSql(insertBodyBuilder, swStorageMessageList);
  542.                 try
  543.                 {
  544.                     // 初始化connectionstring连接字符串对象
  545.                     EciServer.InitFramework();
  546.                     DBHelper.ExecuteNoneQuery(insertBodyBuilder.ToString());
  547.                 }
  548.                 catch (Exception ex)
  549.                 {
  550.                     Log.Write("SwStorageMessageList插入失败:" + ex.Message, "InsertErr");
  551.                 }
  552.                 #endregion XML数据信息实体--END
  553.                 // 创建XML-->Declaration节点的子节点(Data)信息
  554.                 CreateDataNode(xmldoc, declareationNode, swStorageMessageList);
  555.             }
  556.         }
  557.         /// <summary>
  558.         /// 创建XML头节点的信息
  559.         /// <author>Asa</author>
  560.         /// <createDate>2019/06/18</createDate>
  561.         /// </summary>
  562.         /// <param name="xmldoc">XmlDocument对象</param>
  563.         /// <param name="rootNode">根节点</param>
  564.         /// <param name="swStorageMessageHead">头信息实体对象</param>
  565.         public static void CreateHeadNode(XmlDocument xmldoc, XmlNode rootNode, SwStorageMessageHead swStorageMessageHead)
  566.         {
  567.             // 声明一个装载XML头信息的节点
  568.             XmlNode headNode = xmldoc.CreateNode(XmlNodeType.Element, "Head"null);
  569.             // 报文编码节点
  570.             XmlNode msgIdNode = xmldoc.CreateNode(XmlNodeType.Element, "MsgId"null);
  571.             // 报文类型节点
  572.             XmlNode msgTypeNode = xmldoc.CreateNode(XmlNodeType.Element, "MsgType"null);
  573.             // 关卡代码节点
  574.             XmlNode customsCodeNode = xmldoc.CreateNode(XmlNodeType.Element, "CustomsCode"null);
  575.             // 作业场所编号节点
  576.             XmlNode supvLoctCodeNode = xmldoc.CreateNode(XmlNodeType.Element, "SupvLoctCode"null);
  577.             // 报文发送时间节点
  578.             XmlNode declDateNode = xmldoc.CreateNode(XmlNodeType.Element, "DeclDate"null);
  579.             // 数据申报类型节点
  580.             XmlNode declareDataTypeNode = xmldoc.CreateNode(XmlNodeType.Element, "DeclareDataType"null);
  581.             // 申报数据报文总数节点
  582.             XmlNode totalMsgNoNode = xmldoc.CreateNode(XmlNodeType.Element, "TotalMsgNo"null);
  583.             // 当前报文序号节点
  584.             XmlNode curMsgNoNode = xmldoc.CreateNode(XmlNodeType.Element, "CurMsgNo"null);
  585.             // 给各个头信息子节点赋值
  586.             msgIdNode.InnerText = swStorageMessageHead.MSG_ID;
  587.             msgTypeNode.InnerText = swStorageMessageHead.MSG_TYPE;
  588.             customsCodeNode.InnerText = swStorageMessageHead.CUSTOMS_CODE;
  589.             supvLoctCodeNode.InnerText = swStorageMessageHead.SUPV_LOCT_CODE;
  590.             declDateNode.InnerText = swStorageMessageHead.DECL_DATE;
  591.             declareDataTypeNode.InnerText = swStorageMessageHead.DECLARE_DATE_TYPE;
  592.             totalMsgNoNode.InnerText = swStorageMessageHead.TOTAL_MSG_NO;
  593.             curMsgNoNode.InnerText = swStorageMessageHead.CUR_MSG_NO;
  594.             // 将各个头信息子节点添加到头信息根节点
  595.             headNode.AppendChild(msgIdNode);
  596.             headNode.AppendChild(msgTypeNode);
  597.             headNode.AppendChild(customsCodeNode);
  598.             headNode.AppendChild(supvLoctCodeNode);
  599.             headNode.AppendChild(declDateNode);
  600.             headNode.AppendChild(declareDataTypeNode);
  601.             headNode.AppendChild(totalMsgNoNode);
  602.             headNode.AppendChild(curMsgNoNode);
  603.             // 将头节点添加到根节点
  604.             rootNode.AppendChild(headNode);
  605.         }
  606.         /// <summary>
  607.         /// 创建XML数据节点的信息
  608.         /// <author>Asa</author>
  609.         /// <createDate>2091/06/18</createDate>
  610.         /// </summary>
  611.         /// <param name="xmldoc">XmlDocument对象</param>
  612.         /// <param name="declareationNode">Declaration节点</param>
  613.         /// <param name="swStorageMessageList"></param>
  614.         public static void CreateDataNode(XmlDocument xmldoc, XmlNode declareationNode, SwStorageMessageList swStorageMessageList)
  615.         {
  616.             // 声明一个装载XML-->Data信息的节点
  617.             XmlNode dataNode = xmldoc.CreateNode(XmlNodeType.Element, "Data"null);
  618.             // 集装箱号
  619.             XmlNode contaId = xmldoc.CreateNode(XmlNodeType.Element, "ContaId"null);
  620.             // 集装箱尺寸
  621.             XmlNode contaTypeCode = xmldoc.CreateNode(XmlNodeType.Element, "ContaTypeCode"null);
  622.             // 箱位代码
  623.             XmlNode seat = xmldoc.CreateNode(XmlNodeType.Element, "Seat"null);
  624.             // 内外贸标识
  625.             XmlNode tradeMark = xmldoc.CreateNode(XmlNodeType.Element, "TradeMark"null);
  626.             // 进出口标识
  627.             XmlNode iEFlag = xmldoc.CreateNode(XmlNodeType.Element, "IEFlag"null);
  628.             // 拼箱状态
  629.             XmlNode contaMark = xmldoc.CreateNode(XmlNodeType.Element, "ContaMark"null);
  630.             // 装载状态
  631.             XmlNode loadMark = xmldoc.CreateNode(XmlNodeType.Element, "LoadMark"null);
  632.             // 危品柜状态
  633.             XmlNode dangerMark = xmldoc.CreateNode(XmlNodeType.Element, "DangerMark"null);
  634.             // 进场时间
  635.             XmlNode entranceDate = xmldoc.CreateNode(XmlNodeType.Element, "EntranceDate"null);
  636.             // 出场时间
  637.             XmlNode departtureDate = xmldoc.CreateNode(XmlNodeType.Element, "DeparttureDate"null);
  638.             // 当前状态
  639.             XmlNode workMark = xmldoc.CreateNode(XmlNodeType.Element, "WorkMark"null);
  640.             // 数据处理标识
  641.             XmlNode dataDealFlag = xmldoc.CreateNode(XmlNodeType.Element, "DataDealFlag"null);
  642.             // 提单号
  643.             XmlNode billNo = xmldoc.CreateNode(XmlNodeType.Element, "BillNo"null);
  644.             // 报关单号
  645.             XmlNode entryId = xmldoc.CreateNode(XmlNodeType.Element, "EntryId"null);
  646.             // 转关单号
  647.             XmlNode preNo = xmldoc.CreateNode(XmlNodeType.Element, "PreNo"null);
  648.             // 多式联运单号
  649.             XmlNode mtApplyBlNo = xmldoc.CreateNode(XmlNodeType.Element, "MtApplyBlNo"null);
  650.             // 备注信息
  651.             XmlNode remark = xmldoc.CreateNode(XmlNodeType.Element, "Remark"null);
  652.             // 给各个Data信息子节点赋值
  653.             contaId.InnerText = swStorageMessageList.CONTA_ID;
  654.             contaTypeCode.InnerText = swStorageMessageList.CONTA_TYPE_CODE;
  655.             seat.InnerText = swStorageMessageList.SEAT;
  656.             tradeMark.InnerText = swStorageMessageList.TRADE_MARK;
  657.             iEFlag.InnerText = swStorageMessageList.IE_FLAG;
  658.             contaMark.InnerText = swStorageMessageList.CONTA_MARK;
  659.             loadMark.InnerText = swStorageMessageList.LOAD_MARK;
  660.             dangerMark.InnerText = swStorageMessageList.DANGER_MARK;
  661.             entranceDate.InnerText = swStorageMessageList.ENTRANCE_DATE;
  662.             departtureDate.InnerText = swStorageMessageList.DEPART_TRUE_DATE;
  663.             workMark.InnerText = swStorageMessageList.WORK_MARK;
  664.             dataDealFlag.InnerText = swStorageMessageList.DATA_DEAL_FLAG;
  665.             billNo.InnerText = swStorageMessageList.BILL_NO;
  666.             entryId.InnerText = swStorageMessageList.ENTRY_ID;
  667.             preNo.InnerText = swStorageMessageList.PRE_NO;
  668.             mtApplyBlNo.InnerText = swStorageMessageList.MT_APPLY_NO;
  669.             remark.InnerText = swStorageMessageList.REMARK;
  670.             // 将各个信息节点加入Data节点
  671.             dataNode.AppendChild(contaId);
  672.             dataNode.AppendChild(contaTypeCode);
  673.             dataNode.AppendChild(seat);
  674.             dataNode.AppendChild(tradeMark);
  675.             dataNode.AppendChild(iEFlag);
  676.             dataNode.AppendChild(contaMark);
  677.             dataNode.AppendChild(loadMark);
  678.             dataNode.AppendChild(dangerMark);
  679.             dataNode.AppendChild(entranceDate);
  680.             dataNode.AppendChild(departtureDate);
  681.             dataNode.AppendChild(workMark);
  682.             dataNode.AppendChild(dataDealFlag);
  683.             dataNode.AppendChild(billNo);
  684.             dataNode.AppendChild(entryId);
  685.             dataNode.AppendChild(preNo);
  686.             dataNode.AppendChild(mtApplyBlNo);
  687.             dataNode.AppendChild(remark);
  688.             // 将data节点加入declareation节点
  689.             declareationNode.AppendChild(dataNode);
  690.         }
  691.         /// <summary>
  692.         /// 构建list表插入SQL语句
  693.         /// <author>Asa</author>
  694.         /// <createDate>2019/06/18</createDate>
  695.         /// </summary>
  696.         /// <param name="insertBodyBuilder">构建插入语句的对象</param>
  697.         /// <param name="swStorageMessageList">插入信息实体</param>
  698.         public static void BuildListInsertSql(StringBuilder insertBodyBuilder, SwStorageMessageList swStorageMessageList)
  699.         {
  700.             insertBodyBuilder.Append("INSERT INTO SW_STORAGE_MESSAGE_LIST(");
  701.             insertBodyBuilder.Append("MSG_ID,CONTA_ID,CONTA_TYPE_CODE,SEAT,TRADE_MARK,IE_FLAG,CONTA_MARK,");
  702.             insertBodyBuilder.Append("LOAD_MARK,DANGER_MARK,ENTRANCE_DATE,DEPART_TRUE_DATE,WORK_MARK,");
  703.             insertBodyBuilder.Append("DATA_DEAL_FLAG,BILL_NO,ENTRY_ID,PRE_NO,MT_APPLY_NO,REMARK,");
  704.             insertBodyBuilder.Append("PLAN_STATUS,IS_TRANSFER,CONTA_TYPE,CONTA_GOODS_TYPE,CONTAINER,");
  705.             insertBodyBuilder.Append("CONTA_OWNER,BOAT_COMPANY,AGENT_COMPANY,LEAD_SEALING,DAMAGE_DESCRIPTION,");
  706.             insertBodyBuilder.Append("DAMAGE_CODE,I_BOAT_NAME,I_BOAT_VOYAGENO,E_BOAT_NAME,E_BOAT_VOYAGENO,STORAGE_DATE,");
  707.             insertBodyBuilder.Append("GOODS_NAME,TOTAL_WEIGHT,GOODS_WEIGHT) VALUES(");
  708.             insertBodyBuilder.Append("'" + swStorageMessageList.MSG_ID + "',");
  709.             insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_ID + "',");
  710.             insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_TYPE_CODE + "',");
  711.             insertBodyBuilder.Append("'" + swStorageMessageList.SEAT + "',");
  712.             insertBodyBuilder.Append("'" + swStorageMessageList.TRADE_MARK + "',");
  713.             insertBodyBuilder.Append("'" + swStorageMessageList.IE_FLAG + "',");
  714.             insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_MARK + "',");
  715.             insertBodyBuilder.Append("'" + swStorageMessageList.LOAD_MARK + "',");
  716.             insertBodyBuilder.Append("'" + swStorageMessageList.DANGER_MARK + "',");
  717.             insertBodyBuilder.Append("to_date('" + swStorageMessageList.ENTRANCE_DATE + "', 'yyyy-MM-dd HH24:mi:ss'),"); //("'" + swStorageMessageList.ENTRANCE_DATE + "'");
  718.             insertBodyBuilder.Append("to_date('" + swStorageMessageList.DEPART_TRUE_DATE + "', 'yyyy-MM-dd HH24:mi:ss'),"); //("'" + swStorageMessageList.DEPART_TRUE_DATE + "'");
  719.             insertBodyBuilder.Append("'" + swStorageMessageList.WORK_MARK + "',");
  720.             insertBodyBuilder.Append("'" + swStorageMessageList.DATA_DEAL_FLAG + "',");
  721.             insertBodyBuilder.Append("'" + swStorageMessageList.BILL_NO + "',");
  722.             insertBodyBuilder.Append("'" + swStorageMessageList.ENTRY_ID + "',");
  723.             insertBodyBuilder.Append("'" + swStorageMessageList.PRE_NO + "',");
  724.             insertBodyBuilder.Append("'" + swStorageMessageList.MT_APPLY_NO + "',");
  725.             insertBodyBuilder.Append("'" + swStorageMessageList.REMARK + "',");
  726.             insertBodyBuilder.Append("'" + swStorageMessageList.PLAN_STATUS + "',");
  727.             insertBodyBuilder.Append("'" + swStorageMessageList.IS_TRANSFER + "',");
  728.             insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_TYPE + "',");
  729.             insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_GOODS_TYPE + "',");
  730.             insertBodyBuilder.Append("'" + swStorageMessageList.CONTAINER + "',");
  731.             insertBodyBuilder.Append("'" + swStorageMessageList.CONTA_OWNER + "',");
  732.             insertBodyBuilder.Append("'" + swStorageMessageList.BOAT_COMPANY + "',");
  733.             insertBodyBuilder.Append("'" + swStorageMessageList.AGENT_COMPANY + "',");
  734.             insertBodyBuilder.Append("'" + swStorageMessageList.LEAD_SEALING + "',");
  735.             insertBodyBuilder.Append("'" + swStorageMessageList.DAMAGE_DESCRIPTION + "',");
  736.             insertBodyBuilder.Append("'" + swStorageMessageList.DAMAGE_CODE + "',");
  737.             insertBodyBuilder.Append("'" + swStorageMessageList.I_BOAT_NAME + "',");
  738.             insertBodyBuilder.Append("'" + swStorageMessageList.I_BOAT_VOYAGENO + "',");
  739.             insertBodyBuilder.Append("'" + swStorageMessageList.E_BOAT_NAME + "',");
  740.             insertBodyBuilder.Append("'" + swStorageMessageList.E_BOAT_VOYAGENO + "',");
  741.             insertBodyBuilder.Append("'" + swStorageMessageList.STORAGE_DATE + "',");
  742.             insertBodyBuilder.Append("'" + swStorageMessageList.GOODS_NAME + "',");
  743.             insertBodyBuilder.Append("'" + swStorageMessageList.TOTAL_WEIGHT + "',");
  744.             insertBodyBuilder.Append("'" + swStorageMessageList.GOODS_WEIGHT + "')");
  745.         }
  746.         /// <summary>
  747.         /// 构建head表插入SQL语句
  748.         /// <author>Asa</author>
  749.         /// <createDate>2019/06/8</createDate>
  750.         /// </summary>
  751.         /// <param name="insertHeadBuilder">构建插入语句的对象</param>
  752.         /// <param name="swStorageMessageHead">插入信息实体</param>
  753.         public static void BuildHeadInsertSql(StringBuilder insertHeadBuilder, SwStorageMessageHead swStorageMessageHead)
  754.         {
  755.             insertHeadBuilder.Append("INSERT INTO SW_STORAGE_MESSAGE_HEAD(");
  756.             insertHeadBuilder.Append("MSG_ID,MSG_TYPE,CUSTOMS_CODE,SUPV_LOCT_CODE,");
  757.             insertHeadBuilder.Append("DECL_DATE,DECLARE_DATE_TYPE,TOTAL_MSG_NO,CUR_MSG_NO) ");
  758.             insertHeadBuilder.Append("VALUES('" + swStorageMessageHead.MSG_ID + "',");
  759.             insertHeadBuilder.Append("'" + swStorageMessageHead.MSG_TYPE + "',");
  760.             insertHeadBuilder.Append("'" + swStorageMessageHead.CUSTOMS_CODE + "',");
  761.             insertHeadBuilder.Append("'" + swStorageMessageHead.SUPV_LOCT_CODE + "',");
  762.             insertHeadBuilder.Append("to_date('" + swStorageMessageHead.DECL_DATE + "', 'yyyy-MM-dd HH24:mi:ss'),");
  763.             insertHeadBuilder.Append("'" + swStorageMessageHead.DECLARE_DATE_TYPE + "',");
  764.             insertHeadBuilder.Append("'" + swStorageMessageHead.TOTAL_MSG_NO + "',");
  765.             insertHeadBuilder.Append("'" + swStorageMessageHead.CUR_MSG_NO + "')");
  766.         }
  767.         /// <summary>
  768.         /// 构建响应报文表头插入SQL语句
  769.         /// <author>Asa</author>
  770.         /// <createDate>2019/06/20</createDate>
  771.         /// </summary>
  772.         /// <param name="insertResponseHeadBuilder">拼接数据插入sql语句StringBuilder对象</param>
  773.         /// <param name="swStorageResponseHead">SwStorageResponseHead实体对象</param>
  774.         public static void BuildResponseHeadInserSql(StringBuilder insertResponseHeadBuilder, SwStorageResponseHead swStorageResponseHead)
  775.         {
  776.             insertResponseHeadBuilder.Append("INSERT INTO SW_STORAGE_RESPONSE_HEAD(MSG_ID,");
  777.             insertResponseHeadBuilder.Append("MSG_TYPE,CUSTOMS_CODE,SUPV_LOCT_CODE,DECL_DATE) VALUES(");
  778.             insertResponseHeadBuilder.Append("'" + swStorageResponseHead.MSG_ID + "',");
  779.             insertResponseHeadBuilder.Append("'" + swStorageResponseHead.MSG_TYPE + "',");
  780.             insertResponseHeadBuilder.Append("'" + swStorageResponseHead.CUSTOMS_CODE + "',");
  781.             insertResponseHeadBuilder.Append("'" + swStorageResponseHead.SUPV_LOCT_CODE + "',");
  782.             insertResponseHeadBuilder.Append("to_date('" + swStorageResponseHead.DECL_DATE + "', 'yyyy-MM-dd HH24:mi:ss'))");//("'" + swStorageResponseHead.DECL_DATE + "')");
  783.         }
  784.         /// <summary>
  785.         /// 构建响应报文表体插入SQL语句
  786.         /// <author>Asa</author>
  787.         /// <createDate>2019/06/20</createDate>
  788.         /// </summary>
  789.         /// <param name="insertResponseListBuilder">拼接数据插入sql语句StringBuilder对象</param>
  790.         /// <param name="swStorageResponseList">SwStorageResponseList实体对象</param>
  791.         public static void BuildResponseListInserSql(StringBuilder insertResponseListBuilder, SwStorageResponseList swStorageResponseList)
  792.         {
  793.             insertResponseListBuilder.Append("INSERT INTO SW_STORAGE_RESPONSE_LIST(MSG_ID,");
  794.             insertResponseListBuilder.Append("RESULT,REMARK) VALUES(");
  795.             insertResponseListBuilder.Append("'" + swStorageResponseList.MSG_ID + "',");
  796.             insertResponseListBuilder.Append("'" + swStorageResponseList.RESULT + "',");
  797.             insertResponseListBuilder.Append("'" + swStorageResponseList.REMARK + "')");
  798.         }
  799.     }
  800. }

                         

                          代码主要是记录给我自己看的,现在说说我在部署过程中遇到的问题吧:


                          当我部署上去的时候,启动服务,但是我从FTP下载文件却一直没成功,下载的方法一直报出操作超时,我改了超时时间也没用

                          想了一下,会不会是FTP的数据端口--20没有开放出来,我用浏览器访问了一下FTP,却又能成功的访问到,排除了这个问题

                            后来和同事研究了很久,才想到可能是FTP的两种传输模式引起的问题,于是我试了一下,将FTP传输模式()改为了被动式,

                            果然就能成功下载FTP上的文件了。(早先所有客户端都使用主动模式,而且工作的很好,而现在因为客户端防火墙的存在,将会关闭一些

                          端口,这样主动模式将会失败。在这种情况下就要使用被动模式,但是一些端口也可能被服务器的防火墙封掉。不过因为ftp服务器需要它的ftp服                           务连接到一定数量的客户端,所以他们总是支持被动模式的。这就是我们为什么要使用被动模式的原意,为了确保数据可以正确的传输,使用 被动                            模式要明显优于主动模式。


                            附上我的FTP工具类,需要的小伙伴可以学习一下:

  1. using System;
  2. using System.IO;
  3. using System.Net;
  4. using System.Text;
  5. using System.Web;
  6. namespace ECI.SW.Common.FTP
  7. {
  8.     /// <summary>
  9.     /// <author>Asa</author>
  10.     /// <createDate>2017-03-07</createDate>
  11.     /// <description>FTP工具类</description>
  12.     /// </summary>
  13.     public class FtpHelper
  14.     {
  15.         private readonly string _ftpPassword;
  16.         private readonly string _ftpServerIp;
  17.         private readonly string _ftpUserId;
  18.         private string _ftpRemotePath;
  19.         private string _ftpUri;
  20.         /// <summary>
  21.         /// 连接FTP
  22.         /// </summary>
  23.         /// <param name="ftpServerIp">FTP连接地址</param>
  24.         /// <param name="ftpRemotePath">指定FTP连接成功后的当前目录, 如果不指定即默认为根目录</param>
  25.         /// <param name="ftpUserId">用户名</param>
  26.         /// <param name="ftpPassword">密码</param>
  27.         public FtpHelper(string ftpServerIp, string ftpRemotePath, string ftpUserId, string ftpPassword)
  28.         {
  29.             _ftpServerIp = ftpServerIp;
  30.             _ftpRemotePath = ftpRemotePath;
  31.             _ftpUserId = ftpUserId;
  32.             _ftpPassword = ftpPassword;
  33.             _ftpUri = "ftp://" + _ftpServerIp + "/" + _ftpRemotePath + "/";
  34.         }
  35.         /// <summary>
  36.         /// 上传
  37.         /// </summary>
  38.         /// <param name="filename">文件名称(含路径)</param>
  39.         public void Upload(string filename)
  40.         {
  41.             var fileInf = new FileInfo(filename);
  42.             var uri = _ftpUri + fileInf.Name;
  43.             var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
  44.             reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  45.             reqFtp.KeepAlive = false;
  46.             reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
  47.             reqFtp.UseBinary = true;
  48.             reqFtp.KeepAlive = true;
  49.             reqFtp.UsePassive = true;
  50.             reqFtp.ContentLength = fileInf.Length;
  51.             reqFtp.ReadWriteTimeout = 60000;
  52.             reqFtp.Timeout = 60000;
  53.             var buffLength = 2048;
  54.             var buff = new byte[buffLength];
  55.             var fs = fileInf.OpenRead();
  56.             try
  57.             {
  58.                 var strm = reqFtp.GetRequestStream();
  59.                 var contentLen = fs.Read(buff, 0, buffLength);
  60.                 while (contentLen != 0)
  61.                 {
  62.                     strm.Write(buff, 0, contentLen);
  63.                     contentLen = fs.Read(buff, 0, buffLength);
  64.                 }
  65.                 strm.Close();
  66.                 fs.Close();
  67.             }
  68.             catch (Exception ex)
  69.             {
  70.                 throw new Exception("Ftphelper Upload Error --> " + ex.Message);
  71.             }
  72.         }
  73.         /// <summary>
  74.         /// 上传
  75.         /// </summary>
  76.         /// <param name="fileInf">提供对客户端已上载的单独文件的访问</param>
  77.         public void Upload(HttpPostedFile fileInf)
  78.         {
  79.             var uri = _ftpUri + fileInf.FileName;
  80.             var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
  81.             reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  82.             reqFtp.KeepAlive = false;
  83.             reqFtp.Method = WebRequestMethods.Ftp.UploadFile;
  84.             reqFtp.UseBinary = true;
  85.             reqFtp.UsePassive = false;
  86.             reqFtp.ContentLength = fileInf.ContentLength;
  87.             var buffLength = 2048;
  88.             var buff = new byte[buffLength];
  89.             var fs = fileInf.InputStream;
  90.             try
  91.             {
  92.                 var strm = reqFtp.GetRequestStream();
  93.                 var contentLen = fs.Read(buff, 0, buffLength);
  94.                 while (contentLen != 0)
  95.                 {
  96.                     strm.Write(buff, 0, contentLen);
  97.                     contentLen = fs.Read(buff, 0, buffLength);
  98.                 }
  99.                 strm.Close();
  100.                 fs.Close();
  101.             }
  102.             catch (Exception ex)
  103.             {
  104.                 throw new Exception("Ftphelper Upload Error --> " + ex.Message);
  105.             }
  106.         }
  107.         /// <summary>
  108.         /// 下载
  109.         /// </summary>
  110.         /// <param name="filePath">保存文件的本地路径</param>
  111.         /// <param name="fileName">要下载的文件名</param>
  112.         public void Download(string filePath, string fileName)
  113.         {
  114.             try
  115.             {
  116.                 var outputStream = new FileStream(filePath + "\\" + fileName, FileMode.Create);
  117.                 var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + fileName));
  118.                 reqFtp.Method = WebRequestMethods.Ftp.DownloadFile;
  119.                 reqFtp.UseBinary = true;
  120.                 reqFtp.KeepAlive = true;
  121.                 reqFtp.UsePassive = true;
  122.                 reqFtp.Timeout = 60000;
  123.                 reqFtp.ReadWriteTimeout = 60000;
  124.                 reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  125.                 var response = (FtpWebResponse)reqFtp.GetResponse();
  126.                 var ftpStream = response.GetResponseStream();
  127.                 var cl = response.ContentLength;
  128.                 var bufferSize = 2048;
  129.                 var buffer = new byte[bufferSize];
  130.                 if (ftpStream != null)
  131.                 {
  132.                     var readCount = ftpStream.Read(buffer, 0, bufferSize);
  133.                     while (readCount > 0)
  134.                     {
  135.                         outputStream.Write(buffer, 0, readCount);
  136.                         readCount = ftpStream.Read(buffer, 0, bufferSize);
  137.                     }
  138.                 }
  139.                 if (ftpStream != null) ftpStream.Close();
  140.                 outputStream.Close();
  141.                 response.Close();
  142.             }
  143.             catch (Exception ex)
  144.             {
  145.                 throw new Exception("FtpHelper Download Error --> " + ex.Message);
  146.             }
  147.         }
  148.         /// <summary>
  149.         /// 删除文件
  150.         /// </summary>
  151.         /// <param name="fileName">文件名</param>
  152.         public void Delete(string fileName)
  153.         {
  154.             try
  155.             {
  156.                 var uri = _ftpUri + fileName;
  157.                 var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
  158.                 reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  159.                 reqFtp.KeepAlive = false;
  160.                 reqFtp.Method = WebRequestMethods.Ftp.DeleteFile;
  161.                 reqFtp.UsePassive = false;
  162.                 var result = string.Empty;
  163.                 var response = (FtpWebResponse)reqFtp.GetResponse();
  164.                 var size = response.ContentLength;
  165.                 var datastream = response.GetResponseStream();
  166.                 if (datastream != null)
  167.                 {
  168.                     var sr = new StreamReader(datastream);
  169.                     result = sr.ReadToEnd();
  170.                     sr.Close();
  171.                 }
  172.                 if (datastream != null) datastream.Close();
  173.                 response.Close();
  174.             }
  175.             catch (Exception ex)
  176.             {
  177.                 throw new Exception("FtpHelper Delete Error --> " + ex.Message + "  文件名:" + fileName);
  178.             }
  179.         }
  180.         /// <summary>
  181.         /// 删除文件夹
  182.         /// </summary>
  183.         /// <param name="folderName">文件夹名称</param>
  184.         public void RemoveDirectory(string folderName)
  185.         {
  186.             try
  187.             {
  188.                 var uri = _ftpUri + folderName;
  189.                 var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(uri));
  190.                 reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  191.                 reqFtp.KeepAlive = false;
  192.                 reqFtp.Method = WebRequestMethods.Ftp.RemoveDirectory;
  193.                 reqFtp.UsePassive = false;
  194.                 var result = string.Empty;
  195.                 var response = (FtpWebResponse)reqFtp.GetResponse();
  196.                 var size = response.ContentLength;
  197.                 var datastream = response.GetResponseStream();
  198.                 if (datastream != null)
  199.                 {
  200.                     var sr = new StreamReader(datastream);
  201.                     result = sr.ReadToEnd();
  202.                     sr.Close();
  203.                 }
  204.                 if (datastream != null) datastream.Close();
  205.                 response.Close();
  206.             }
  207.             catch (Exception ex)
  208.             {
  209.                 throw new Exception("FtpHelper Delete Error --> " + ex.Message + "  文件名:" + folderName);
  210.             }
  211.         }
  212.         /// <summary>
  213.         /// 获取当前目录下明细(包含文件和文件夹)
  214.         /// </summary>
  215.         /// <returns></returns>
  216.         public string[] GetFilesDetailList()
  217.         {
  218.             try
  219.             {
  220.                 var result = new StringBuilder();
  221.                 var ftp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri));
  222.                 ftp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  223.                 ftp.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
  224.                 ftp.UsePassive = false;
  225.                 var response = ftp.GetResponse();
  226.                 var reader = new StreamReader(response.GetResponseStream(), Encoding.Default);
  227.                 var line = reader.ReadLine();
  228.                 while (line != null)
  229.                 {
  230.                     result.Append(line);
  231.                     result.Append("\n");
  232.                     line = reader.ReadLine();
  233.                 }
  234.                 result.Remove(result.ToString().LastIndexOf("\n"), 1);
  235.                 reader.Close();
  236.                 response.Close();
  237.                 return result.ToString().Split('\n');
  238.             }
  239.             catch (Exception ex)
  240.             {
  241.                 //downloadFiles = null;
  242.                 throw new Exception("FtpHelper  Error --> " + ex.Message);
  243.             }
  244.         }
  245.         /// <summary>
  246.         /// 获取当前目录下文件列表(仅文件)
  247.         /// </summary>
  248.         /// <returns></returns>
  249.         public string[] GetFileList(string mask)
  250.         {
  251.             var result = new StringBuilder();
  252.             try
  253.             {
  254.                 var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri));
  255.                 reqFtp.UseBinary = true;
  256.                 reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  257.                 reqFtp.Method = WebRequestMethods.Ftp.ListDirectory;
  258.                 reqFtp.KeepAlive = true;
  259.                 reqFtp.UsePassive = true;
  260.                 reqFtp.Timeout = 60000;
  261.                 var response = reqFtp.GetResponse();
  262.                 var reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
  263.                 var line = reader.ReadLine();
  264.                 while (line != null)
  265.                 {
  266.                     if ((mask.Trim() != string.Empty) && (mask.Trim() != "*.*"))
  267.                     {
  268.                         var mask_ = mask.Substring(0, mask.IndexOf("*"));
  269.                         if (line.Substring(0, mask_.Length) == mask_)
  270.                         {
  271.                             result.Append(line);
  272.                             result.Append("\n");
  273.                         }
  274.                     }
  275.                     else
  276.                     {
  277.                         result.Append(line);
  278.                         result.Append("\n");
  279.                     }
  280.                     line = reader.ReadLine();
  281.                 }
  282.                 result.Remove(result.ToString().LastIndexOf('\n'), 1);
  283.                 reader.Close();
  284.                 response.Close();
  285.                 return result.ToString().Split('\n');
  286.             }
  287.             catch (Exception ex)
  288.             {
  289.                 if (ex.Message.Trim() != "远程服务器返回错误: (550) 文件不可用(例如,未找到文件,无法访问文件)。")
  290.                     throw new Exception("FtpHelper GetFileList Error --> " + ex.Message);
  291.                 return null;
  292.             }
  293.         }
  294.         /// <summary>
  295.         /// 获取当前目录下所有的文件夹列表(仅文件夹)
  296.         /// </summary>
  297.         /// <returns></returns>
  298.         public string[] GetDirectoryList()
  299.         {
  300.             var drectory = GetFilesDetailList();
  301.             var m = string.Empty;
  302.             foreach (var str in drectory)
  303.             {
  304.                 var dirPos = str.IndexOf("<DIR>");
  305.                 if (dirPos > 0)
  306.                 {
  307.                     /*判断 Windows 风格*/
  308.                     m += str.Substring(dirPos + 5).Trim() + "\n";
  309.                 }
  310.                 else if (str.Trim().Substring(01).ToUpper() == "D")
  311.                 {
  312.                     /*判断 Unix 风格*/
  313.                     var dir = str.Substring(54).Trim();
  314.                     if ((dir != ".") && (dir != ".."))
  315.                         m += dir + "\n";
  316.                 }
  317.             }
  318.             char[] n = { '\n' };
  319.             return m.Split(n);
  320.         }
  321.         /// <summary>
  322.         /// 判断当前目录下指定的子目录是否存在
  323.         /// </summary>
  324.         /// <param name="remoteDirectoryName">指定的目录名</param>
  325.         public bool DirectoryExist(string remoteDirectoryName)
  326.         {
  327.             var dirList = GetDirectoryList();
  328.             foreach (var str in dirList)
  329.                 if (str.Trim() == remoteDirectoryName.Trim())
  330.                     return true;
  331.             return false;
  332.         }
  333.         /// <summary>
  334.         /// 判断当前目录下指定的文件是否存在
  335.         /// </summary>
  336.         /// <param name="remoteFileName">远程文件名</param>
  337.         public bool FileExist(string remoteFileName)
  338.         {
  339.             var fileList = GetFileList("*.*");
  340.             foreach (var str in fileList)
  341.                 if (str.Trim() == remoteFileName.Trim())
  342.                     return true;
  343.             return false;
  344.         }
  345.         /// <summary>
  346.         /// 创建文件夹
  347.         /// </summary>
  348.         /// <param name="dirName"></param>
  349.         public void MakeDir(string dirName)
  350.         {
  351.             try
  352.             {
  353.                 // dirName = name of the directory to create.
  354.                 var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + dirName));
  355.                 reqFtp.Method = WebRequestMethods.Ftp.MakeDirectory;
  356.                 reqFtp.UseBinary = true;
  357.                 reqFtp.UsePassive = false;
  358.                 reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  359.                 var response = (FtpWebResponse)reqFtp.GetResponse();
  360.                 var ftpStream = response.GetResponseStream();
  361.                 if (ftpStream != null) ftpStream.Close();
  362.                 response.Close();
  363.             }
  364.             catch (Exception ex)
  365.             {
  366.                 throw new Exception("FtpHelper MakeDir Error --> " + ex.Message);
  367.             }
  368.         }
  369.         /// <summary>
  370.         /// 获取指定文件大小
  371.         /// </summary>
  372.         /// <param name="filename">文件名称</param>
  373.         /// <returns></returns>
  374.         public long GetFileSize(string filename)
  375.         {
  376.             long fileSize = 0;
  377.             try
  378.             {
  379.                 var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + filename));
  380.                 reqFtp.Method = WebRequestMethods.Ftp.GetFileSize;
  381.                 reqFtp.UseBinary = true;
  382.                 reqFtp.UsePassive = false;
  383.                 reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  384.                 var response = (FtpWebResponse)reqFtp.GetResponse();
  385.                 var ftpStream = response.GetResponseStream();
  386.                 fileSize = response.ContentLength;
  387.                 ftpStream.Close();
  388.                 response.Close();
  389.             }
  390.             catch (Exception ex)
  391.             {
  392.                 throw new Exception("FtpHelper GetFileSize Error --> " + ex.Message);
  393.             }
  394.             return fileSize;
  395.         }
  396.         /// <summary>
  397.         /// 改名
  398.         /// </summary>
  399.         /// <param name="currentFilename">当前文件名</param>
  400.         /// <param name="newFilename">新文件名</param>
  401.         public void ReName(string currentFilename, string newFilename)
  402.         {
  403.             try
  404.             {
  405.                 var reqFtp = (FtpWebRequest)WebRequest.Create(new Uri(_ftpUri + currentFilename));
  406.                 reqFtp.Method = WebRequestMethods.Ftp.Rename;
  407.                 reqFtp.RenameTo = newFilename;
  408.                 reqFtp.UseBinary = true;
  409.                 reqFtp.UsePassive = false;
  410.                 reqFtp.Credentials = new NetworkCredential(_ftpUserId, _ftpPassword);
  411.                 var response = (FtpWebResponse)reqFtp.GetResponse();
  412.                 var ftpStream = response.GetResponseStream();
  413.                 if (ftpStream != null) ftpStream.Close();
  414.                 response.Close();
  415.             }
  416.             catch (Exception ex)
  417.             {
  418.                 throw new Exception("FtpHelper ReName Error --> " + ex.Message);
  419.             }
  420.         }
  421.         /// <summary>
  422.         /// 移动文件
  423.         /// </summary>
  424.         /// <param name="currentFilename">当前文件名</param>
  425.         /// <param name="newDirectory">新文件夹</param>
  426.         public void MovieFile(string currentFilename, string newDirectory)
  427.         {
  428.             ReName(currentFilename, newDirectory);
  429.         }
  430.         /// <summary>
  431.         /// 切换当前目录
  432.         /// </summary>
  433.         /// <param name="directoryName">文件夹名称</param>
  434.         /// <param name="isRoot">true 绝对路径   false 相对路径</param>
  435.         public void GotoDirectory(string directoryName, bool isRoot)
  436.         {
  437.             if (isRoot)
  438.                 _ftpRemotePath = directoryName;
  439.             else
  440.                 _ftpRemotePath += directoryName + "/";
  441.             _ftpUri = "ftp://" + _ftpServerIp + "/" + _ftpRemotePath + "/";
  442.         }
  443.     }
  444. }


                            


评价

剑轩

2019/6/27 13:46:44

内容是真的长!

通过url传递一个带井号()的参数并正确获取

正常情况下支持通过url是不能传递#等特殊符号的但是可以通过url编码解码解决通过url传递参数时某些特殊符号不能传递的问题n...

rabbitmq官网上六大版块之二(Direct类型交换机通过routingKey分类型输出)

其实rabbitmq,老师都说得差不多了,下面是老师的连接。http://www.tnblog.net/aojiancc2/article/UserCategory/134官网教...

通过PlUpload控件配合WebApi接口完成压缩上传文件

最近一段时间都在使用PlUpload做文件上传的功能,研究过后感觉使用起来体验还是比较好的,不过网上的资料很多都记录的很简...

.net core 通过不同Accept访问同方法请求不同方法处理

1.对于自定义的Accept需要进行注册比如我这里的application/vnd.cgzl.hateoas+jsonservices.AddMvc(option=&gt; { option...

.netcore 通过Flurl验证k8s内部访问与获取环境变量

.netcore验证k8s内部访问与获取环境变量[TOC] 创建k8s-name项目 项目结构如下 实验过程 st=>start: k8s-demo项...

.netcore 通过Flurl验证k8s内部访问与获取环境变量 (二)

.netcore验证k8s内部访问与获取环境变量 (二)[TOC] 修改k8s-name项目 NameController.cs [ApiController] ...

consul 无法通过ip访问

consul agent -dev 只能本地可以访问要想通过ip可以访问,使用下面的使用即可consul agent -dev -client 0.0.0.0 -ui 指定...

Python中通过fake_useragent生成随机UserAgent

fake_useragent第三方库,来实现随机请求头的设置;GitHub ---&gt; https://github.com/hellysmile/fake-useragent安...

js与后台通过json传递对象

原理图解:前台:&lt;!DOCTYPEhtml&gt; &lt;html&gt; &lt;head&gt; &lt;metacharset=&quot;utf-8&quot;/&gt; &lt;title...

sqlsugar 对接mysql分表。sqlsguar分表注意事项。分表思路,通过日期获取分表表名等

官方文档:https://www.donet5.com/Home/Doc?typeId=1201 sqlsguar分表注意事项注意一:需要有一个分表字段,插入的时候...

K8s 通过 firewalld 放行端口

K8s通过firewalld放行端口对于etcd节点,运行以下命令: 1、firewall-cmd--permanent--add-port=2376/tcp 2、firewal...

vue3 ref的使用多个ref的使用。通过ref触发点击事件

多个ref获取的方法可以使用一样的,通过变量名来区分就行了 const vabUploadRef = ref() const multipleTableRef = ref() ...

vue切换菜单,vue菜单选中。跳转页面通过原生js设置选中样式。vue中使用原生js方法。js 找到当前对象的兄弟对象。js获取子节点。js获取父节点。js获取当前元素的同级节点

vue切换菜单,跳转页面通过原生js设置选中样式可以利用上面那个js获取当前元素的同级节点后先设置默认的样式,然后在设置点...

vue3 ref转化成 HTMLElement。vue3通过ref获取dom节点

vue3其实是可以直接利用ref获取dom节点的,代码如下&lt;template&gt; &lt;div class=&quot;app-container&quot;&gt; ...

docker 通过内部ip内网ip容器名,自定义网络别名,访问mysql。以及无法连接问题排查

docker 是可以通过内部ip,容器名,自定义网络别名,访问mysql的。一般来说只要mysql与程序在同一个网段都是可以使用内部ip...
a genius is the person who repeats the most times
排名
35
文章
15
粉丝
5
评论
5
vue.js 学习日记第五章-v-if和v-for指令的使用方式
饰心 : 吃惊!博客更新小王子?
vue.js 学习日记第三章-vue中的简单事件及事件修饰符
修心 : 一个专栏可以的!说一下前端的mvc就更好了
通过PlUpload控件配合WebApi接口完成压缩上传文件
剑轩 : 厉害了,这个很实用。这个可以实现图片压缩?
C#+selenium实现自动登录
剑轩 : 坐标不能是线性的,因为人拖动的时候不是线性的。可以试下这个思路...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
倘若是为了爱而放弃一切,最终连同这份爱意都会丧失掉。