我有一个“普通”的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”
如何在不创建额外页面的情况下解决这个问题?
答案 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)
您是否尝试过设置ContentType
到application/json
和End
的响应,如下所示:
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;
}
}