C# POst 接收或发送XML

摘自:http://www.cnblogs.com/Fooo/p/3529371.html

 

项目分成两个 web(ASP.Net)用户处理请求,客户端(wpf/winform)发送请求

1.web项目

有两个页面

SendPost.aspx(单纯发送数据给客户端)

代码:

public partial class SendPost : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.RequestType == "POST")
{
  //声明一个XMLDoc文档对象,LOAD()xml字符串
  XmlDocument doc = new XmlDocument();
  doc.LoadXml("<entity><version>1.2.0_2012_12_05</version></entity>");
  //把XML发送出去
  Response.Write(doc.InnerXml);
  Response.End();
}
}
}

Accept.aspx(接收数据并反馈发送会客户端)

protected void Page_Load(object sender, EventArgs e)
{
if (Request.RequestType == "POST")
{
  //接收并读取POST过来的XML文件流
  StreamReader reader = new StreamReader(Request.InputStream);
  String xmlData = reader.ReadToEnd();
  //把数据重新返回给客户端
  Response.Write(xmlData);
  Response.End();
}
}

2.客户端项目:

一个处理Post类

public class PostHelp
{
public string GetWebContent(string url)
{
Stream outstream = null;
Stream instream = null;
StreamReader sr = null;
HttpWebResponse response = null;
HttpWebRequest request = null;
// 要注意的这是这个编码方式,还有内容的Xml内容的编码方式
Encoding encoding = Encoding.GetEncoding("UTF-8");
byte[] data = encoding.GetBytes(url);

// 准备请求,设置参数
request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "text/xml";
//request.ContentLength = data.Length;

outstream = request.GetRequestStream();
outstream.Write(data, 0, data.Length);
outstream.Flush();
outstream.Close();
//发送请求并获取相应回应数据

response = request.GetResponse() as HttpWebResponse;
//直到request.GetResponse()程序才开始向目标网页发送Post请求
instream = response.GetResponseStream();

sr = new StreamReader(instream, encoding);
//返回结果网页(html)代码

string content = sr.ReadToEnd();
return content;
}
public string PostXml(string url, string strPost)
{
string result = "";

StreamWriter myWriter = null;
HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url);
objRequest.Method = "POST";
//objRequest.ContentLength = strPost.Length;
objRequest.ContentType = "text/xml";//提交xml 
//objRequest.ContentType = "application/x-www-form-urlencoded";//提交表单
try
{
myWriter = new StreamWriter(objRequest.GetRequestStream());
myWriter.Write(strPost);
}
catch (Exception e)
{
return e.Message;
}
finally
{
myWriter.Close();
}

HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
using (StreamReader sr = new StreamReader(objResponse.GetResponseStream()))
{
result = sr.ReadToEnd();
sr.Close();
}
return result;
}
}

一个XML处理类

public class XMLHelp
{
private XDocument _document;

public XDocument Document
{
get { return _document; }
set { _document = value; }
}
private string _fPath = "";

public string FPath
{
get { return _fPath; }
set { _fPath = value; }
}

/// <summary>
/// 初始化数据文件,当数据文件不存在时则创建。
/// </summary>
public void Initialize()
{
if (!File.Exists(this._fPath))
{
this._document = new XDocument(
new XElement("entity", string.Empty)
);
this._document.Save(this._fPath);
}
else
this._document = XDocument.Load(this._fPath);
}


public void Initialize(string xmlData)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(xmlData);

this._document = XmlDocumentExtensions.ToXDocument(doc, LoadOptions.None);
}
/// <summary>
/// 清空用户信息
/// </summary>
public void ClearGuest()
{
XElement root = this._document.Root;
if (root.HasElements)
{
XElement entity = root.Element("entity");
entity.RemoveAll();
}
else
root.Add(new XElement("entity", string.Empty));
}


///LYJ 修改
/// <summary>
/// 提交并最终保存数据到文件。
/// </summary>

public void Commit()
{
try
{
this._document.Save(this._fPath);
}
catch (Exception ex)
{
throw new Exception(ex.Message, ex);
}
}

/// <summary>
/// 更新
/// </summary>
public void UpdateQrState(string PId, string state)
{
XElement root = this._document.Root;
XElement entity = root.Element("entity");

IEnumerable<XElement> elements = entity.Elements().Where(p =>
p.Attribute("PId").Value == PId);
if (elements.Count() == 0)
return;
else
{
XElement guest = elements.First();
guest.Attribute("FQdState").Value = state;
guest.Attribute("FQdTime").Value = DateTime.Now.ToString();
Commit();
}
}

public IEnumerable<XElement> GetXElement()
{
XElement root = this._document.Root;
IEnumerable<XElement> elements = root.Elements();
return elements;
}

 

public DataTable GetEntityTable()
{
DataTable dtData = new DataTable();
XElement root = this._document.Root;
IEnumerable<XElement> elements = root.Elements();

foreach (XElement item in elements)
{
dtData.Columns.Add(item.Name.LocalName);
}
DataRow dr = dtData.NewRow();
int i = 0;
foreach (XElement item in elements)
{
dr[i] = item.Value;
i = i + 1;
}
dtData.Rows.Add(dr);
return dtData;
}

}

因为我这里用的是Linq操作XML所以多一个转换XML类

public static class XmlDocumentExtensions
{
public static XDocument ToXDocument(this XmlDocument document)
{
return document.ToXDocument(LoadOptions.None);
}

public static XDocument ToXDocument(this XmlDocument document, LoadOptions options)
{
using (XmlNodeReader reader = new XmlNodeReader(document))
{
return XDocument.Load(reader, options);
}
}
}

客户端加个按钮,按钮代码

private void button5_Click(object sender, RoutedEventArgs e)
{
PostHelp ph = new PostHelp();
//请求,拿到数据
string value = ph.GetWebContent("http://192.168.52.24:802/SendPost.aspx");
//保存数据
XMLHelp xh = new XMLHelp();
xh.Document = XDocument.Parse(value);
xh.FPath = Environment.CurrentDirectory + "\\xml\\a.xml";
xh.Commit();
//重新把数据拿出来,发送
string a = xh.Document.ToString();
string text = ph.PostXml("http://192.168.52.24:802/Accept.aspx", a);
//根据得到数据显示
this.textBlock1.Text = text;
//把数据转换成DataTable,输出要的结果集
DataTable dt = xh.GetEntityTable();
MessageBox.Show(dt.Rows[0][0].ToString());

}

转载于:https://www.cnblogs.com/a-mumu/p/5603969.html

### 使用 C# 发送接收 XML 数据 #### 构建 Web API 控制器来处理 HTTP 请求和响应 Web API 控制器可以通过返回 `IActionResult` 其派生类型(如 `OkObjectResult`, `BadRequestResult` 等)来发送 HTTP 响应[^1]。为了实现这一点,首先需要设置一个能够接受 POST 请求的方法,并配置该方法以解析传入的 XML 数据。 对于接收 XML 数据的情况,在 ASP.NET Core 中可以利用 `[FromBody]` 属性配合自定义输入格式化程序默认支持的 XML 序列化机制。下面展示了一个用于接收 XML 的控制器动作示例: ```csharp using Microsoft.AspNetCore.Mvc; // ... other usings ... [ApiController] [Route("[controller]")] public class XmlDataController : ControllerBase { [HttpPost] public IActionResult Post([FromBody] Person person) { if (!ModelState.IsValid || person == null) return BadRequest(); // Process the received 'person' object here... return Ok(new { Message = "Person data successfully processed." }); } } ``` 此代码片段假设存在名为 `Person` 的模型类,它已经被适当地标记以便于 XML 反序列化[^2]。 #### 定义可被序列化的对象结构 要使 .NET 能够正确地将接收到的数据映射到强类型的实例上,必须确保目标类具有适当的属性装饰符。例如,如果希望从客户端接收到如下形式的 XML 文档,则应该像这样设计 `Person` 类: ```xml <Person> <Name>John Doe</Name> <Age>30</Age> </Person> ``` 对应的 C# 类定义如下所示: ```csharp using System.Xml.Serialization; [XmlRoot("Person")] public class Person { [XmlElement("Name")] public string Name { get; set; } [XmlElement("Age")] public int Age { get; set; } } ``` #### 向服务器端提交 XML 并获取响应 当准备向上述 Web API 提交 XML 数据时,可以选择多种方式完成这一任务。这里给出一种基于 HttpClient 的简单例子,展示了怎样构建请求消息体并将结果作为字符串打印出来: ```csharp using System.Net.Http; using System.Text; using System.Threading.Tasks; class Program { private static async Task Main(string[] args) { var client = new HttpClient(); var xmlContent = @"<Person><Name>Jane Smith</Name><Age>28</Age></Person>"; HttpContent content = new StringContent(xmlContent, Encoding.UTF8, "application/xml"); HttpResponseMessage response = await client.PostAsync("https://example.com/api/XmlData", content); string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseBody); } } ``` 这段代码会构造一条包含特定 XML 内容的消息,并将其发送给指定 URL 上的服务端点;之后再读取服务端返回的内容并显示在控制台上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值