1

我得到了一个“正常”的 ascx 页面,其中包含 HTML 部件以及后面的代码。这些元素都应该在正常情况下显示(作品)。

现在我希望能够设置一个请求参数,该参数会导致页面 zu 呈现不同。然后它在该页面上发送的信息不是人类可读的,而是用于机器的:

 string jsonProperty = Request["JSonProperty"];
                if (!string.IsNullOrEmpty(jsonProperty))
                {                    
                    Response.Clear();
                    Response.Write(RenderJSon());
                  //  Response.Close();
                    return;

此代码位于 Page_PreRender 内。现在我的问题是:字符串已正确发送到浏览器,但之后仍然呈现“标准”html-content。

当我删除“Response.Close();” 评论 我收到“ERR_INVALID_RESPONSE”

任何线索如何在不创建额外页面的情况下解决这个问题?

4

4 回答 4

6

我可以建议 Response.End() 可以引发错误。

使用 Response.SuppressContent = true; 停止进一步处理“标准”html

string jsonProperty = Request["JSonProperty"];
if (!string.IsNullOrEmpty(jsonProperty))
{                    
    Response.Clear();
    Response.ContentType = "application/json";
    Response.Write(RenderJSon());

    Response.Flush();                    // Flush the data to browser
    Response.SuppressContent = true;     // Suppress further output - "standard" html-
                                         // content is not rendered after this

    return;
} 
于 2013-07-24T16:28:51.340 回答
1

尝试添加Response.End()

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

另外,正如@Richard 所说,添加

context.Response.ContentType = "application/json";
于 2012-06-11T12:54:08.127 回答
1

您是否尝试过设置ContentTypetoapplication/jsonEnd'ing 响应,如下所示:

string jsonProperty = Request["JSonProperty"];
if (!string.IsNullOrEmpty(jsonProperty))
{                    
    Response.Clear();
    Response.ContentType = "application/json";
    Response.Write(RenderJSon());
    Response.End();

    return;
}    
于 2012-06-11T12:54:41.820 回答
0

建议避免调用Response.End(),即使它会导致正确的行为。这是因为提供该方法是为了向后兼容旧的 ASP,而不是为支持性能而设计的。为了防止进一步处理,它会抛出一个ThreadAbortException, 丢弃线程,强制系统稍后在处理新请求时启动一个新线程,而不是能够将该线程返回到 ASP.NET 线程池。停止进一步处理 ASP.NET 管道的推荐替代方法是HttpApplication.CompleteRequest()立即调用并返回。但是,这不会终止 ASP.NET 页的处理。

为了防止进一步的内容被发送到客户端,当然可以设置Response.SuppressContenttrue. 这将阻止.aspx文件的内容被发送到客户端。但是,.aspx仍然会呈现。这包括.aspx可能依赖于您在Load事件中加载的数据的运行逻辑。

为避免渲染,您可以设置Page.Visiblefalse. 这会导致调用Rendercontrol()被跳过

为此,您需要将逻辑移动到Load()事件而不是PreRender()事件中。

使用您的代码,将是:

protected void Page_Load(object sender, EventArgs e)
{
    var jsonProperty = Request["JSonProperty"];
    if (!string.IsNullOrEmpty(jsonProperty))
    {
        Response.ContentType = "application/json";
        Response.Write(RenderJSon());
        Context.ApplicationInstance.CompleteRequest();
        Visible = false;
        return;
    }
}
于 2020-05-22T03:13:34.880 回答