【问题标题】:C# WebResponse clarification (I'm confused about the functionality of part of the code and need a deeper understanding)C# WebResponse 澄清(我对部分代码的功能感到困惑,需要更深入的了解)
【发布时间】:2013-12-19 15:32:48
【问题描述】:

我有这个更新函数,可以将 JSON 数据 POST 到一个 url,我从堆栈溢出问题中得到了大部分 POST 部分。但我有点难以理解它的含义。

这是我的代码:

protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
      GridViewRow row = GridView1.Rows[e.RowIndex];
      string startTime = row.Cells[1].Text;
      string endTime = row.Cells[2].Text;
      string furnace = row.Cells[4].Text;
      long ID = Convert.ToInt64(GridView1.DataKeys[e.RowIndex].Values[0].ToString());
      CascadingDropDown cddSubsystem = (CascadingDropDown) row.FindControl("cddSubsystem");
      CascadingDropDown cddReason = (CascadingDropDown) row.FindControl("cddReason");
      DropDownList ddForcedSched = (DropDownList) row.FindControl("ddEditForcedSched");
      TextBox txtComments = (TextBox) row.FindControl("txtEditOperatorComments");

      // cascading dropdowns have the selected value formatted like this ReasonCode:::ReasonName
      string[] reason = cddReason.SelectedValue.Split(new string[] {":::"}, StringSplitOptions.None);
      string[] subsystem = cddSubsystem.SelectedValue.Split(new string[] {":::"}, StringSplitOptions.None);

      // get the machine code
      string machine = "";
      foreach (SorEvent evt in _events)
          if (evt.Id == ID)
              machine = evt.MachineCode;

      // create SorEvent object to post
      SorEvent updateSorEvent = new SorEvent()
      {
          Id = ID,
          Furnace = furnace,
          StartTime = Convert.ToDateTime(startTime),
          EndTime = endTime != " " ? Convert.ToDateTime(endTime) : (DateTime?) null,
          MachineCode = machine,
          ReasonCode = reason[0],
          SubsystemCode = subsystem[0],
          ForceScheduleFlag = ddForcedSched.SelectedValue,
          OperatorComments = txtComments.Text,
      };

      // POST to url
      string url = @"http://cannot.divulge:3020/this/URL/";
      HttpWebRequest req = WebRequest.Create(new Uri(url)) as HttpWebRequest;
      req.Accept = "application/json";
      req.ContentType = "application/json";
      req.Method = "POST";

      // build a string with the params and encode it
      string data = JsonConvert.SerializeObject(updateSorEvent);
      ASCIIEncoding encoding = new ASCIIEncoding();
      Byte[] bytes = encoding.GetBytes(data);

      // send the request
      using (Stream post = req.GetRequestStream())
      {
          post.Write(bytes, 0, bytes.Length);
      }

      var response = req.GetResponse();
      var stream = response.GetResponseStream();
      var sr = new StreamReader(stream);
      var content = sr.ReadToEnd();

      // return to non-edit state
      GridView1.EditIndex = -1;
      SetData();
}

我了解大部分 POST 功能,但我对以下内容感到困惑:

var response = req.GetResponse();
var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

我知道响应变量从我上面定义的请求中获取响应,然后我从响应中创建一个流并读取它并将其设置为一个名为 content 的变量。

那段代码的目的是表明 url POST 成功了吗?

我知道

post.Write(bytes, 0, bytes.length);

正在做实际的post,所以后面的代码必须是为了确认。

这是我获得代码的地方:POSTing JSON to URL via WebClient in C#

【问题讨论】:

    标签: c#


    【解决方案1】:

    这段代码很不言自明,你似乎理解得很好。

    除了收到回复并不意味着一切正常。 从技术上讲,表明进展顺利的应该是响应状态码。

    200 表示一切正常,404 表示页面未找到,5XX 表示服务器错误等等。 More info on Wikipedia

    请注意,这也取决于您发布的服务的开发人员以及他如何处理成功/失败请求:例如,他可以始终返回一个带有自己的响应对象 (json/xml/...)指示一切顺利与否的状态代码(例如:如果发布了错误的数据,则为错误状态),在这种情况下,您将获得请求本身的状态代码 200,因为它确实有效,但您需要将响应内容解析为知道一切是否真的很顺利。其他开发人员可能会使用 HTTP 响应状态代码来指示过程的成功或失败,包括软件错误。

    我认为最后一个是最佳实践。作为信息问题,例如,jQuery 使用状态代码在执行 AJAX 请求时在 successerror 处理程序之间切换。这就是为什么我认为以这种方式处理错误会更好......

    【讨论】:

    • 有道理,这就是为什么它在调试时返回错误 404,因为我使用的 url 不正确。所以它基本上只是返回状态代码(自定义或其他)。感谢您的回答!
    【解决方案2】:

    您是对的,因为在阅读了您的 POST 的响应后,您只是忽略了它,尽管这可能不是一个好主意。响应可能包含警告或错误消息,而您只是忽略了它 - 惹麻烦了!

    所以基本来说你是……

    1. 将一些数据发布到 URL
    2. 获取响应数据
    3. 把响应数据扔掉
    4. 在幸福的无知中继续前进

    也许你应该...

    1. 将一些数据发布到 URL
    2. 获取响应数据
    3. 检查您是否收到 SUCCESS 响应(200 等)并且内容是否合理
    4. 自信地继续前进!

    【讨论】:

    • 当我调试它时,我得到了一个错误 404,当时我并不确定发生了什么,我把那个代码注释掉了。所以我回去查看代码,意识到我知道它的其余部分在做什么,我只是不知道那部分在做什么。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 2015-07-12
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多