【问题标题】:Without Response.End() code does't works fine没有 Response.End() 代码不能正常工作
【发布时间】:2014-01-07 17:19:13
【问题描述】:

我正在使用 jquery ajax 函数,如果将 Response.End() 放在服务器端,我会在成功函数中接收数据我不明白这是什么原因????

<script type="text/javascript">
    $(document).ready(function() {
        $.ajax({
            url: "WebForm1.aspx",
            type: "POST",
            datatype: "json",
            success: function(data) {

                alert(reuslt.CustomerID);

            }
        });
    });

在 WebForm1.aspx 中

protected void Page_Load(object sender, EventArgs e)
        {
            Customer c = new Customer();
            c.CustomerID = "1";
            c.ContactName = "Jhon";
            c.CompanyName = "Dell";
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            String response = serializer.Serialize(c);
            Response.Write(response);
            Response.End();

          }

客户类别

public class Customer
    {
        public string CustomerID { get; set; }
        public string CompanyName { get; set; }
        public string ContactName { get; set; }

    }

【问题讨论】:

  • msdn.microsoft.com/en-us/library/ms524629(v=vs.90).aspx 我不是 C# 开发人员,但可能会阻止其他一些代码输出使您的 json 无效的内容。它立即中止请求并将迄今为止生成的内容返回给浏览器。
  • 打开 Dev Tools Network 选项卡,查看服务器向您发送的内容。
  • 您应该为此使用 HTTP 处理程序,而不是页面的全部开销。
  • 我只是想从服务器接收 json 结果,我已经阅读了许多几乎相同但在我的场景中不起作用的教程,为什么 Response.End 可以正常工作,否则会出错。
  • @Ali 我的评论解释了为什么它可以解决问题,大多数答案也解释了这一点以及如何解决它。您对这些答案的哪一部分有疑问?

标签: c# javascript jquery json


【解决方案1】:

您没有使用 Web 方法,这意味着 de .aspx 文件仍会给出 HTML 的响应。 Response.end() 结束响应,这意味着不再执行代码。

你需要做的是:

在VB文件中:

[System.Web.Services.WebMethod(BufferResponse=false)]
public Customer getCustomer()
{
   //implementation code
   return new Customer(); // The code you need
}

jQuery:

    $.ajax({
                type: "POST",
                url: "WebForm1.aspx/getCustomer", // Webmethod function here
                data: {},
                contentType: "application/json;charset=utf-8",
                dataType: "json",
                async:false,
                success: function (json) {
                    var msg = JSON.parse(json.d);
                    alert(msg.customerID);
                },
                failure: function () {
                    alert("Sorry,there is a error!");
                }
            });

信息:

  1. Webmethod
  2. jQuery ICM webmethod call (stackoverflow answer)
  3. 更多信息可以在 Google 上搜索 jQuery c# Webmethod 找到。

UDPATE
因为阿里想具体知道为什么使用response.end 而没有它会失败。因为response.end 会结束请求。所以没有进一步的代码被执行。这意味着 HTML 未呈现。如果没有此代码,HTML 将被呈现并作为响应进行响应。这意味着 JSON + HTML 是请求的输出。

将所有当前缓冲的输出发送到客户端,停止执行 页面,并引发 EndRequest 事件。

由于Response.end 引发了文档中引用的异常(如上)。最好使用HttpContext.Current.ApplicationInstance.CompleteRequest

【讨论】:

  • 我不想使用 web 方法我只是想知道为什么 Response.End() 使我的代码工作正常
【解决方案2】:

我不知道确切的输出,但想法是您的 Web 表单 (.aspx) 使用页面生命周期。如果您没有通过调用Response.End() 来结束生命周期,页面将继续处理并发送到输出流。

因此,如果您不告诉 ASP.NET 停止输出到响应流,它最终会到达其渲染阶段并写出 .asxp 文件的内容。

如果您不调用 Response.End() 来查看返回的内容,请尝试使用 Fiddler 查看生成的响应/html。

(还有@Niels 所说的——我的回答更多是针对非 ajax 实现)

【讨论】:

  • 但是如何在不使用 web 方法和 Response.End() 的情况下解决我的问题
  • 网络表单不能这样工作。您必须要么使用[WebMethod()],创建一个Web 服务,要么创建一个可以发回您正在寻找的响应的页面。连接到特定 url 的处理程序也可能对您有用,但这些解决方案不是很清楚。看来您主要担心的可能是缺少会话状态访问权限?
  • 或者您可以使用 UpdatePanel 控件为您执行 ajax。这很容易做到,但在两端所需的带宽方面会增加大量开销。
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多