防止aspx页面呈现

时间:2012-06-11 12:50:03

标签: asp.net httpresponse

我有一个“普通”的ascx-Page,其中包含HTML-Parts以及后面的代码。这些元素都应该在正常条件下显示(工作)。

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

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

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

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

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

4 个答案:

答案 0 :(得分: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;
} 

答案 1 :(得分:2)

尝试添加Response.End()

  

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

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

context.Response.ContentType = "application/json";

答案 2 :(得分:1)

您是否尝试过设置ContentTypeapplication/jsonEnd的响应,如下所示:

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

    return;
}    

答案 3 :(得分:0)

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

为防止进一步的内容发送到客户端,可以将Response.SuppressContent设置为true。这样可以防止.aspx文件的内容发送到客户端。但是,.aspx仍将呈现。这包括.aspx中的运行逻辑,该逻辑可能取决于您在Load事件中加载的数据。

为避免呈现,可以将Page.Visible设置为false。这个causes the call to Rendercontrol() to be skipped

要使其正常工作,您需要将逻辑移至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;
    }
}