【问题标题】:ASP.NET - Sending responses in JSON - Response received is impossible, considering the source codeASP.NET - 以 JSON 格式发送响应 - 考虑到源代码,不可能收到响应
【发布时间】:2020-12-14 06:22:52
【问题描述】:

我的基类定义了以下方法:

protected void RespondWithJson<T>(T graph)
{
    var response = HttpContext.Current.Response;
    ClearResponse();
    response.ContentType = "text/json";
    DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));
    ds.WriteObject(response.OutputStream, graph);
    response.End();
    Sql_Disconnect();
}

该方法属于所有将响应 JSON 的页面,具体取决于 URL 中的查询参数。

当您考虑所涉及的源代码时,我从我的一个页面得到的响应毫无意义。

该页面用于为我们的拣货和打包操作单独提交拣货。 RespondWithJson 是这些页面用来确定其响应的唯一方法。

picksubmission 页面做出的唯一响应是 PickSubmissionResult 类型

例如

RespondWithJson(new PickSubmissionResult() { message = "Some URL Parameters are missing from the call!" });

但是,我从该页面实际得到的响应是 List&lt;PickingRow&gt; 类型的

一个完全在服务器上的不同页面将使用List&lt;PickingRow&gt;做出响应。

那么为什么在这个页面上调用了另一个页面的方法呢??

【问题讨论】:

  • 与答案无关,但您应该阅读Is Response.End() considered harmful?的答案
  • 欣赏评论 - 我想我已经发现了实际问题,我认为这是因为我的每个页面都有一个订阅属于静态类的事件的方法。我的理解是,这个静态实例对于每个请求/页面都是唯一的——显然情况并非如此。结果,即使在访问不同的页面时,也会调用此处理程序的先前访问页面的版本。 - 我将不得不修改我的一些代码,看看问题是否仍然存在。

标签: c# asp.net json http serialization


【解决方案1】:

解决了。

以前,我将“请求者”类设置为静态。 我现在已将每个页面对此类的引用替换为对它们自己的此类的单个实例的引用(现在是动态类)

    protected Requestor requestor;

    protected override void Page_Load(object sender, EventArgs e)
    {
        requestor = new Requestor();
        requestor.SessionSet += Requestor_SessionSet;
    }

现在 Requestor_SessionSet 处理程序仅在最后访问的页面上调用,而不是在域的生命周期内的所有访问页面。

这里的教训:

静态实例不是请求/页面独有的,而是服务器范围的

【讨论】:

    猜你喜欢
    • 2016-04-03
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2015-04-11
    相关资源
    最近更新 更多