GVKun编程网logo

asp.net – 在请求结束前触发Application_EndRequest?(http请求结束)

5

在这篇文章中,我们将带领您了解asp.net–在请求结束前触发Application_EndRequest?的全貌,包括http请求结束的相关情况。同时,我们还将为您介绍有关.net–Applicat

在这篇文章中,我们将带领您了解asp.net – 在请求结束前触发Application_EndRequest?的全貌,包括http请求结束的相关情况。同时,我们还将为您介绍有关.net – Application_Error不会触发?、36 Request对象 Session Application、Application & Session & Request & Page、Application application_1512618719369_147804 failed 2 times due to ApplicationMaster for attempt app的知识,以帮助您更好地理解这个主题。

本文目录一览:

asp.net – 在请求结束前触发Application_EndRequest?(http请求结束)

asp.net – 在请求结束前触发Application_EndRequest?(http请求结束)

我有一些简单的类需要在请求结束时处理.

为此,我在Global.asax中的Application_EndRequest事件中对这些对象调用dispose方法.

这“在我的机器上工作正常”但在我的生产服务器上导致一些问题我无法访问已处理的对象.这在一些MVC助手中发生.

在我看来,Application_EndRequest在请求结束时被触发.这不是这种情况吗?我应该用另一个事件处理我的物品吗?

解决方法

应用程序池问题 – 可能

我怀疑你的一次性对象不是请求而是应用范围(它可以根据请求实例化,但可能使用一些共享资源).只要您在开发环境中测试应用程序,它似乎就像预期的那样行事,但只要您将其投入生产就会出现问题.这表示您可能遇到应用程序池问题.

IIS Web应用程序池功能实际上为您的应用程序实例化了几个HttpApplication实例,它们可能都共享公共可用资源.如果您的一次性物品就是这种情况并且您正在共享它,则可能是它不是线程安全的.如果不将共享资源使用包装在线程安全操作中,情况也是如此.

这就是为什么当一个请求正在进行时,另一个请求开始并且第一个处理该对象而第二个进程仍在使用它时可能发生这种情况.

更多信息总是有帮助的

如果您解释一次性物体/资源的性质以及您在应用程序中如何使用它,我们可以更好地帮助您.但与此同时,您可以read my blog post讨论应用程序池并处理它们.这不是关于一次性物品本身,但您仍然可以发现所有信息非常有用和有用.

.net – Application_Error不会触发?

.net – Application_Error不会触发?

在Webform1.aspx.cs中:
protected void Page_Load(object sender,EventArgs e)
{
    throw new Exception("test exception");
}

在Global.asax.cs中:

protected void Application_Error(object sender,EventArgs e)
{
    // Code that runs when an unhandled error occurs
    if (Server.GetLastError() is HttpUnhandledException)
        Server.Transfer("ErrUnkNown.aspx");
}

但是从不调用Application_Error事件处理程序.相反,我得到一个运行时错误页面.

在抛出异常后,我需要做什么才能调用Application_Error?

解决方法

它看起来很好,应该调用Application_Error.

您是否通过调试应用程序进行了检查?

实际上你缺少Server.ClearError()所以异常被传递给asp.net但你应该在这里压制它,因为你自己处理它.

protected void Application_Error(object sender,EventArgs e)
{
    // Code that runs when an unhandled error occurs
    if (Server.GetLastError() is HttpUnhandledException)
    {
        // suppressing the error so it should not pass to asp.net
        Server.ClearError();
        Server.Transfer("ErrUnkNown.aspx");
    }
}

36 Request对象 Session Application

36 Request对象 Session Application

1. request的setAttribute与getAttribute方法一般都是成对出现的,首先通过setAttribute方法设置属性与属性值,然后通过getAttribute方法根据属性获取到与该属性对应的对象值(获取到之后一般都需要进行向下类型转换,将属性值转换为真正的对象)。setAttribute与getAttribute方法都是在服务器端内部执行的客户端不知道服务器端是否执行过这两个方法。

程序对比

(1)

request1.jsp

<form action="request2.jsp">
    
    
    username: <input type="text" name="username">
    
    <input type="submit" value="submit">
    
    </form>

request2.jsp

<% String username = request.getParameter("username"); %>
    
    
    username: <%= username %>
    
    <% request.setAttribute("username", username); %>
    
    
    
    <jsp:forward page="request3.jsp"></jsp:forward>
request3.jsp

<% String username = (String)request.getAttribute("username"); %>
    
    <%= username %>

(2)


request2.jsp

<% String username = request.getParameter("username"); %>
    
    
    username: <%= username %>
    
    <% request.setAttribute("username", username); %>
    
       <a href="request3.jsp">request3.jsp</a>
程序1执行结果可以获取的属性值,程序2不能获取到属性值。




2. request的getParameter方法的作用是获取到客户端 通过表单或url请求参数所发送过来的参数值,是客户端与服务器端之间的交互服务器端要想获取到客户端发送过来的数据,就需要使用getParameter方法来获取。没有与getParameter方法对应的setParameter方法。



3. request对象内数据的存活范围就是在request对象的存活范围内,当客户端向服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了;之后再向服务器端发送新的请求时,服务器会创建新的request对象,该request对象与之前的request对象没有任何关系,因此也无法获得在之前的request对象中所存放的任何数据。

4. session对象内数据的存活范围也就是session对象的存活范围(?只要浏览器不关闭,session对象就会一直存在?),因此在同一个浏览器窗口中,无论向服务器端发送多少个请求,session对象只有一个。

Session程序


session1.jsp

<form action="/test/Session2.jsp">
	<input type="text" name="username"/>  
	<input type="submit" value="submit"/>

</form>
session2.jsp

<%String username=request.getParameter("username"); 
   
   session.setAttribute("username", username);
    %>
  <h1> 欢迎登陆 <%= username %></h1>
   
   <a href="Session3.jsp">check</a>

session3.jsp

<%
    String name=(String)session.getAttribute("username");
   	if(name==null)
   	{%>
   		您还未登陆
   	<%}
   	else
   	{ %>
    <%= name %>您已经登陆
   	<% }
     %>

5. application(应用对象):存活范围最大的对象,只要服务器没有关闭,application对象中的数据就会一直存在。在整个服务器运行过程当中,application对象只有一个。

<body>
   <%  
   	int count=1;
      if (application.getAttribute("count")==null)
	   {
	   			count=1;
	   			application.setAttribute("count", count);
	   
	   }
	   else
	   {
		  count=Integer.parseInt(application.getAttribute("count").toString());
		  count++;
		   application.setAttribute("count", count);
		   
	   }
	      %>
	 <h1>您是第<%= count %>位访问者 </h1>
  </body>

6. request、session以及application这3个对象的范围是逐个增加的:request只在一个请求的范围内;session是在浏览器窗口的范围内?;application则是在整个服务器的运行过程中。

Application & Session & Request & Page

Application & Session & Request & Page

Web交互的最基本单位为HTTP请求。每个用户从进入网站到离开网站这段过程称为一个HTTP会话,一个服务器的运行过程中会有多个用户访问,就是多个HTTP会话。

Application

作用范围在服务器启动到服务器关闭为止。Application 的范围最大、停留的时间也最久,所以使用时要特别注意不然可能会造成服务器负载越来越重的情况。只要将数据存入Application对象,数据的范围 (Scope) 就为Application。

具有Application范围的对象被绑定到 javax.servlet.ServletContext 中。在Web应用程序运行期间,所有的页面都可以访问在这个范围内的对象。

Application对象的主要方法:
getAttribute(String name)     return Object     
getAttributeNames()             return Enumeration
getInitParameter(String name)
getServletInfo()
setAttribute(String name , Object object)

Session(会话)

HTTP会话开始到结束这段时间。Session 的作用范围为用户和服务器所连接的一段持续时间,与服务器断线,这个属性就无效了。

Session 的开始时刻比较容易判断,它从浏览器发出第一个HTTP请求即可认为会话开始。但结束时刻就不好判断了,因为浏览器关闭时并不会通知服务器,所以只能通过如下这种方法判断:如果一定的时间内客户端没有反应,则认为会话结束。Tomcat的默认值为120分钟,这个值也可以通过HttpSession的setMaxInactiveInterval()方法来设置。具有session范围的对象被绑定到 javax.servlet.http.HttpSession 对象中。

Session对象的主要方法:
getAttribute(String name) return Object
getAttributeNames() return Enumeration
getCreationTime() return long
getId() return String
getLastAccessedTime() return long
getMaxInactiveInterval() return int
removeAttribute(String name) void
setAttribute(String name , java.lang.Object value) void 

Requset

HTTP请求开始到结束这段时间。Request 的范围是在一网页发出请求到另一个网页之间。一个HTTP请求的处理可能需要多个Servlet合作,这几个Servlet之间可以通过某种方式传递信息,这个信息在请求结束后就失效。具有Request范围的对象被绑定到javax.servlet.ServletRequest 对象中。Request对象对于每一个客户请求都是不同的,所以对于每一个新的请求,都要重新创建和删除这个范围内的对象。

Request对象的主要方法:
getParameter(String name) return String
getParameterNames() return Enumeration
getParameterValues(String name) return String[]

Page

作用范围:当前页面从打开到关闭这段时间,它只能在同一个页面中有效。

具有Page范围的对象被绑定到 javax.servlet.jsp.PageContext 对象中。

Application application_1512618719369_147804 failed 2 times due to ApplicationMaster for attempt app

Application application_1512618719369_147804 failed 2 times due to ApplicationMaster for attempt app

今天遇到一个特别怪的问题,之前etl中的hive任务一直报错,持续一上午,也没有查出原因,错误的任务的日志也找到,原本可以找到原因,但是打开日志,心里面一凉,什么报错也没有,不知所错。最后观察报错的节点,最终集中到两台机器,那就看看是不是这两台机器的hadoop的程序引起的吗?看看他们的程序都在,但是查看nodemanager的日志一直报错,并且查看cpu,nodemanager进程占用的cpu达1000%多,马上眼前一亮,知道cpu占用太多,导致ap不能联系,导致任务失败,最后把这两台机器的nodemanager重启一下,观察了一下,任务不在报错。继续努力.............

关于asp.net – 在请求结束前触发Application_EndRequest?http请求结束的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于.net – Application_Error不会触发?、36 Request对象 Session Application、Application & Session & Request & Page、Application application_1512618719369_147804 failed 2 times due to ApplicationMaster for attempt app的相关信息,请在本站寻找。

本文标签: