草庐IT

c# - 从 PostAsync() 读取 XML 响应

coder 2024-07-02 原文

我正在使用 PostAsync()发送数据,代码完全按预期执行。我将数据发送到的站点提供了一个 XML通知成功或失败的响应通知。 XML响应是这样的: 成功 的帖子返回 1

<?xml version="1.0" encoding="utf-8" ?>
<result>
 <success>1</success>
 <uploadid/>
 </errors>
</result>

虽然不成功 返回 <error> 之间的原因标签

<?xml version="1.0" encoding="utf-8" ?>
<result>
 <success>0</success>
 <iploadid/>
 <errors>
    <error>File is not in correct format</error>
 </errors>
</result>

这是我用来执行 PostAsync()C# 语法我需要添加什么才能阅读 XML页面的响应?

private void SendAsyncData()
{
  string connectionString = "Data Source=hmod;Initial Catalog=salesdb;uid=userid;password=password;MultipleActiveResultSets=True";
  DataTable grds = new DataTable();
  using (var con = new SqlConnection(connectionString))
  using (var cmd = new SqlCommand("procedureone", con))
  using (var da = new SqlDataAdapter(cmd))
  {
    cmd.CommandType = CommandType.StoredProcedure;
    da.Fill(grds);
  }
  var client = new HttpClient();
  var q = string.Empty;
  foreach (DataRow row in grds.Rows)
  {
    var parameterSet = new List<KeyValuePair<string, string>>();
    for (int i = 0; i < grds.Columns.Count; ++i)
    {
        parameterSet.Add(new KeyValuePair<string, string>(grds.Columns[i].ColumnName, row[i].ToString()));

    }

    var result = client.PostAsync("http://weneedsampledata/ashx", new FormUrlEncodedContent(parameterSet)).Result;
    string resultContent = result.Content.ReadAsStringAsync().Result;
  }
}

编辑
目前,即使接收数据的站点抛出错误,此语法也会返回代码 200(成功),我需要一种“读取”XML 响应的方法来确定数据是否真的成功。我试图在下面添加以读取响应,但它给我一个编译错误:

'System.Net.Http.HttpResponseMessage' does not contain a definition for 'GetResponse' and no extension method 'GetResponse' accepting a first argument of type 'System.Net.Http.HttpResponseMessage' could be found (are you missing a using directive or an assembly reference?)

var response = result.GetResponse();
Stream receiveStream = response.GetResponseStream();
StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8);
var postresult = readStream.ReadToEnd();
var xml = System.Xml.Linq.XElement.Parse(postresult);
if (xml.Elements("success").FirstOrDefault().Value == "1")
{
  lblgoodbad.Text = "It was good.";
}
else
{
  var errors = xml.Elements("errors");
  foreach (var error in errors.Elements("error"))
  {
    lblgoodbad.Text = error.Value;
  }
}

编辑#2
感谢@Hussey 的帮助——我只是对我的语法做了一个快速调整,它就可以正常运行了。我的完整语法是这样的:

    private void SendAsyncData()
{
  string connectionString = "Data Source=hmod;Initial Catalog=salesdb;uid=userid;password=password;MultipleActiveResultSets=True";
  DataTable grds = new DataTable();
  using (var con = new SqlConnection(connectionString))
  using (var cmd = new SqlCommand("procedureone", con))
  using (var da = new SqlDataAdapter(cmd))
  {
    cmd.CommandType = CommandType.StoredProcedure;
    da.Fill(grds);
  }
  var client = new HttpClient();
  var q = string.Empty;
  foreach (DataRow row in grds.Rows)
  {
    var parameterSet = new List<KeyValuePair<string, string>>();
    for (int i = 0; i < grds.Columns.Count; ++i)
    {
        parameterSet.Add(new KeyValuePair<string, string>(grds.Columns[i].ColumnName, row[i].ToString()));

    }

    var result = client.PostAsync("http://weneedsampledata/ashx", new FormUrlEncodedContent(parameterSet)).Result;
    string resultContent = result.Content.ReadAsStringAsync().Result;
    var xml = System.Xml.Linq.XElement.Parse(resultContent);
    if (xml.Elements("success").FirstOrDefault().Value == "1")
    {
      lblgoodbad.Text = "It was good.";
    }
    else
    {
      var errors = xml.Elements("errors");
      foreach (var error in errors.Elements("error"))
      {
        lblgoodbad.Text = error.Value;
      }
    }
  }
}

最佳答案

能否请您添加这一行并尝试:

在这一行之后:

string resultContent = await result.Content.ReadAsStringAsync();

添加这个:

XElement incomingXml = XElement.Parse(resultContent);

或者您也可以使用 ReadAsStreamAsync 尝试此选项以将流读入 XmlDocument:

string resultContent = await result.Content.ReadAsStreamAsync();

XDocument incomingXml = XDocument.Load(resultContent);

关于c# - 从 PostAsync() 读取 XML 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36274570/

有关c# - 从 PostAsync() 读取 XML 响应的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. Ruby 写入和读取对象到文件 - 2

    好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信

  4. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  5. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  6. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  9. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  10. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

    文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

随机推荐