代码结构说明
这段代码的主要功能是:
从指定文件夹中读取所有 XML 文件。
将每个 XML 文件的内容通过 HTTP POST 请求发送到指定的 API 地址。
处理服务器的响应,并记录每个文件的处理结果。
cs
using System;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
namespace EMS数据回传
{
class Program
{
static void Main(string[] args)
{
// XML 文件夹路径
string xmlFolderPath = @"Z:\toMesXml";
// 服务器 API 地址
string apiUrl = "服务器 API 地址";
// 你的 AppId
string appId = "你的 AppId";
// 你的 AppKey
string appKey = "你的 AppKey";
// Topic 名称
string topic = "Topic 名称";
// 消息 Tag
string tag = "消息 Tag";
try
{
// 获取文件夹中的所有 XML 文件
string[] xmlFiles = Directory.GetFiles(xmlFolderPath, "*.xml");
// 如果文件夹中没有 XML 文件,输出提示并退出
if (xmlFiles.Length == 0)
{
Console.WriteLine("文件夹中没有 XML 文件。");
return;
}
// 遍历每个 XML 文件并发送
foreach (string xmlFile in xmlFiles)
{
try
{
// 输出当前正在处理的文件
Console.WriteLine(string.Format("正在处理文件: {0}", xmlFile));
// 1. 读取 XML 文件内容
string xmlContent = ReadXmlFile(xmlFile);
// 2. 发送 HTTP 请求
string response = SendHttpRequest(apiUrl, appId, appKey, topic, tag, xmlContent);
// 3. 处理响应,输出发送成功的信息
Console.WriteLine(string.Format("文件 {0} 发送成功,服务器响应: {1}", xmlFile, response));
}
catch (XmlException ex)
{
// 捕获 XML 格式错误
Console.WriteLine(string.Format("文件 {0} 格式错误: {1}", xmlFile, ex.Message));
}
catch (IOException ex)
{
// 捕获文件读取失败错误
Console.WriteLine(string.Format("文件 {0} 读取失败: {1}", xmlFile, ex.Message));
}
catch (WebException ex)
{
// 捕获 HTTP 请求失败错误
Console.WriteLine(string.Format("文件 {0} 发送失败,HTTP 错误: {1}", xmlFile, ex.Message));
}
catch (Exception ex)
{
// 捕获其他未知错误
Console.WriteLine(string.Format("文件 {0} 发生未知错误: {1}", xmlFile, ex.Message));
}
}
}
catch (Exception ex)
{
// 捕获全局错误
Console.WriteLine("发生错误: " + ex.Message);
}
}
// 读取 XML 文件内容
static string ReadXmlFile(string filePath)
{
// 检查文件是否存在,如果不存在则抛出异常
if (!File.Exists(filePath))
{
throw new FileNotFoundException("XML 文件未找到: " + filePath);
}
// 使用 StreamReader 指定编码读取文件
using (StreamReader reader = new StreamReader(filePath, Encoding.GetEncoding("GB2312"))) // 根据文件编码调整
{
// 读取文件的全部内容并返回
string xmlContent = reader.ReadToEnd();
return xmlContent;
}
}
// 发送 HTTP 请求
static string SendHttpRequest(string url, string appId, string appKey, string topic, string tag, string xmlContent)
{
// 创建 HTTP 请求
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
// 设置请求方法为 POST
request.Method = "POST";
// 设置请求内容类型为 XML
request.ContentType = "application/xml";
// 添加请求头
request.Headers.Add("X-HW-ID", appId); // AppId
request.Headers.Add("X-HW-APPKEY", appKey); // AppKey
request.Headers.Add("MsgTopic", topic); // Topic
request.Headers.Add("MsgTag", tag); // Tag
// 将 XML 内容转换为字节数组
byte[] data = Encoding.UTF8.GetBytes(xmlContent);
// 设置请求内容的长度
request.ContentLength = data.Length;
// 将 XML 内容写入请求体
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(data, 0, data.Length);
}
// 获取服务器响应
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream responseStream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
{
// 读取服务器响应的内容并返回
return reader.ReadToEnd();
}
}
}
}
代码功能详解
-
文件夹路径和 API 配置:
-
xmlFolderPath
:指定存放 XML 文件的文件夹路径。 -
apiUrl
:华为服务器的 API 地址。 -
appId
和appKey
:用于身份验证的 AppId 和 AppKey。 -
topic
和tag
:消息的主题和标签。
-
-
读取文件夹中的 XML 文件:
-
使用
Directory.GetFiles
方法获取文件夹中所有.xml
文件。 -
如果文件夹中没有文件,输出提示并退出程序。
-
-
遍历并处理每个 XML 文件:
-
使用
foreach
循环遍历每个文件。 -
调用
ReadXmlFile
方法读取文件内容。 -
调用
SendHttpRequest
方法将文件内容发送到服务器。 -
捕获并处理可能发生的异常(如文件格式错误、读取失败、HTTP 请求失败等)。
-
-
读取 XML 文件内容:
-
使用
StreamReader
读取文件内容,并指定文件编码为GB2312
。 -
如果文件不存在,抛出
FileNotFoundException
异常。
-
-
发送 HTTP 请求:
-
使用
HttpWebRequest
创建 HTTP POST 请求。 -
设置请求头(AppId、AppKey、Topic、Tag)。
-
将 XML 内容写入请求体。
-
获取服务器响应并返回响应内容。
-
-
异常处理:
- 对文件读取、XML 解析、HTTP 请求等操作进行异常捕获,确保程序健壮性。
代码运行流程
-
程序启动后,检查指定文件夹中是否存在 XML 文件。
-
如果存在文件,逐个读取文件内容并发送到服务器。
-
每次发送后,输出服务器的响应内容。
-
如果发生错误,输出错误信息并继续处理下一个文件。
注意事项
-
文件编码:
- 代码中假设 XML 文件的编码是
GB2312
,如果文件编码不同,需要调整StreamReader
的编码参数。
- 代码中假设 XML 文件的编码是
-
HTTP 请求超时:
- 如果服务器响应较慢,可能需要设置
HttpWebRequest.Timeout
属性,避免请求长时间挂起。
- 如果服务器响应较慢,可能需要设置
-
异常处理:
- 代码中对常见异常进行了捕获,但可以根据实际需求进一步细化异常处理逻辑。
如果有其他问题,欢迎继续讨论!