Server.TransferRequest Is Not Preserving HttpContext.Items
Sep 13, 2010
I've just updated my ASP.Net code from HttpContext.RewritePath(targetPath) to use the .Net 3.5 function: HttpContext.Server.TransferRequest(targetPath,true)
However, I now no longer have any of the custom HttpContext.Items that I added, before the transfer.
I have a webapplication based on MonoRail, where we utilize the routing feature from MonoRail. On the first request after the application has started, the routing isn't initialized. To circumvent this, I have the following code in Application_OnError():
public virtual void Application_OnError() { if ( // identified as routing error ) Server.TransferRequest( Context.Request.RawUrl, false ); return; }
Problem beeing that on our development server (which runs server 2008 R2, with IIS 7.5 and .NET 3.5) returns a blank page without headers, but on my workstation (which runs win7, IIS 7.5 and .NET 3.5) it works fine.
What could be the cause of this? If the code in Application_OnError() throws an exception, what would be the expected output?
I have verified the following:
The access-log shows one entry, I'm not sure if a TransferRequest would show up as a second entry when invoked successfullyThe application actually do some work according to my internal logs, and it doesn't die since a subsequent requests works flawlessly (because routing will be active)
I was under the impression that you could use the HttpContext.Current.Items collection to pass information between pages but it doesnt seem to workLets say i have a Page1 ButtonClick, the button click handler stores a value in the collection like so; HttpContext.Current.Items("Test1") = "Test"Then i do Response.Redirect("Page2.aspx").In the Form_Load of Page2, HttpContext.Current.Items("Test1") contains nothing. Why does this not work when its all part of the same postback?This would be perfect, because i wouldnt need to worry about clearing the values between requests because they would automatically get cleared each time the page was posted back.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Try loginRep = BusinessLogic.SR.GetUserName("99999") System.Web.HttpContext.Current.Items.Clear() System.Web.HttpContext.Current.Items.Add("RepId",loginRep)
I don't any errors and when in the run in the immediate window:
? System.Web.HttpContext.Current.items("RepId") in the immediate window on THAT page I get the OBJECT.
Then I have a hyperlink with navigateurl to the next page "~/ActCnt.aspx"
On that page, ActCnt.aspx, when in the code I have:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadIf Not Page.IsPostBack Then Dim loginRep As BusinessLogic.SalesRep = System.Web.HttpContext.Current.Items("RepId")
In the immediate window ? System.Web.HttpContext.Current.Items("RepId") returns a String that is equal to "RepId".
Even if I change it to not be an object, but a string I only get the Name "RepId" of the keypair. I have NEVER gotten the actual value.
We're migrating an application to use IIS7 integrated mode. In library code that is designed to work either within the context of an HTTP request or not, we commonly have code like this:
if (HttpContext.Current != null && HttpContext.Current.Request != null) { // do something with HttpContext.Current.Request } else { // do equivalent thing without HttpContext.. }
But in IIS7 integrated mode the check for HttpContext.Current.Request throws an exception whenever this code is called from Application_Start.
System.Web.HttpException: Request is not available in this context
How can I detect whether the request is really available without wrapping these calls in an exception handler and taking action based on whether an exception is generated or not.
Looking at HttpContext in Reflector I see it has an internal bool HideRequestResponse field but it's internal so I can only get to it with reflection and that's fragile. Is there a more official/approved way to determine if it's ok to call HttpContext.Request?
This blog post about the subject says not to use HttpContext, but how, in generic library code, can you determine if it's ok to use HttpContext?
I'm using the work-around mentioned there which is to use Application_BeginRequest and an initialized field to only initialize once as part of BeginRequest, but that has to be done in every calling application whereas I'd prefer to make the library code more robust and handle this situation regardless of where it's called from.
Does anyone knows why HttpContext.Current.Server.MapPath within a server control works when I run the server control but gives and error whilst in Design mode?
I have some code that works fine when I need to delete some image files from a directory on my web server:
Dim ImageURL As String = dsImages.Tables(0).Rows(iImgRow).Item("ImageURL") Dim physicalName = Server.MapPath(ImageURL) oUpload.DeleteFileFromServer(physicalName, iAdid, iImgID)
.but I am running into a problem when a maintenance task running in a separate thread at set intervals determines that files like the above need to be deleted:
Dim ImageURL As String = dsImage.Tables(0).Rows(i - 1).Item("ImageURL") Dim iImgID As Integer = dsImage.Tables(0).Rows(i - 1).Item("ImageId") Dim physicalName As String = HttpContext.Current.Server.MapPath(ImageURL) oUpload.DeleteFileFromServer(physicalName, iAdID, iImgID)
In this latter case, HttpContext.Current.Server.MapPath(ImageURL) has a value of Nothing.Is there a way to get the full path for this case?
My web application is hosted on a loadbalanced and whenever the requests are routed to one of them(say Server B), the request fails. Now I want to redirect my requests to the working server (Server A) which always works.
I want to do it via the HttpContext.Current.Server = "ServerA";
How can I do this. Do I need to create a new HttpContext Object ?
In an asynchronous process, I need to get the name of the domain/server the web application is running on. But in that situation HttpContext.Current is not available, so I cant use HttpContext.Current.Request.ServerVariables("SERVER_NAME").
I am using 3.5 .NET VB. In a code behind I am calling a page using this approach:HttpContext.Current.Server.Execute("Survey.aspx").On the survey.aspx page I have several textboxes are varying sizes. If I run the survey.aspx page alone, the textbox appear on the screen in the correctsizesettings. However, when I use the HttpContext.Current.Server.Execute method to execute the survery.aspx page from another page, the textboxes always come back a fixed width of like 200px or so. It doesnt matter what I change the size of the width to in the survey.aspx page, they are always rendered the same size for every textbox on the page. The changes do show up if I view the survey.aspx page alone though without calling it through another page so I know my syntax for changing the width settings is correct.Does anyone have any idea what causes this and how to resolve it? I am stumped.
I have been experimenting with code that will clear all of the cookies in an HttpContext.Response.Initially, I used this:
DateTime cookieExpires = DateTime.Now.AddDays(-1); for (int i = 0; i < HttpContext.Request.Cookies.Count; i++) { HttpContext.Response.Cookies.Add( new HttpCookie(HttpContext.Request.Cookies[i].Name, null) { Expires = cookieExpires }); }
this will error with an OutOfMemoryException because the for loop never exits - each time you add a cookie to the Response, it also gets added to the `Request.
i'm using an example in which i can fake the session.It's for use in a unittest of a mvc controller.In the test i create a controller and then i do this:
FakeHttpContext httpctx = new FakeHttpContext(null,null,null,null,mSessionItems ); ControllerContext ctx2 = new ControllerContext(httpctx,new RouteData(), target);
here mSessionItems is my session and target is my instance of a controller,and indeed, when i'm in a controller reading this.ControllerContext.HttpContext.Session, i have a session, great!but.... i also read the session outside the controller, and there i use HttpContext.Current.Session, and that is null (or actualy, the HttpContext.Current is null).
I want to read a message from SQL server and send it via email ,with its formatting maintained.
Sql server has the message stored into it via powerbuilder(different environment),When i send the email with HTML enabled all the formatting with which the message was saved is a lost
if the code below would achieve what I want, which is: Check if the query parameters 'return_path' and/or 'user_state' are present in the query string, and if so append them to the query string of the redirect URI. As I'm not a .NET dev and don't have a server to test this on, I was hoping someone could give me some feedback.
ArrayList vars = new ArrayList(); vars.Add("return_path"); vars.Add("user_state");[code].....
I' m using Reorder list sample for the first time. When it is bound with datasource, and reordered it is working fine. but unfortunately on postback to the server, i',m not getting the reordered items.
I'm developing a service in which users can upload images and save them in a library. I want to preserve the original file (so people can upload high resolution images), but also make a copy of the image to use as a thumbnail.
The problem I have is that the thumbnail "weights" much more than the original file, proportionally. When I check the basic properties of each file (in XnView), I can see that the original files are for instance saved with 32 bits per Plane, whereas the source file will have, for instance, only 24 bits per plane.
What would be the correct way to make a copy of the original file while still using compression? This is an excerpt of the code:
private void ResizeImage(string originalFile, string NewFile, int NewWidth, int MaxHeight, bool OnlyResizeIfWider, string directory) { System.Drawing.Image FullsizeImage = System.Drawing.Image.FromFile(originalFile); // Prevent using images internal thumbnail
I have a web form with a repeater and an update panel with a ListView, the ListView contains a LinkButton, when I click the LinkButton a new window opens, when I click the Back Button I return to the form with the repeater but the ListView has disappered leaving a blank Update Panel.
how I can preserve viewstate and see the ListView when I click the BackButton.
I have an asp:TreeView in my MasterPage, which is loaded on demand from a database using some custom functions to fill the Tree. My tree will only ever be 4 levels deep (root -> 1st sublevel -> 2nd sublevel -> leaf nodes) What I want to achieve is preserving the expand/collapse state of this TreeView while navigating between different aspx pages, that all share the MasterPage holding my TreeView. I have been using the methods described in these resources:
[URL]
but I am still not getting the results I want... My TreeView markup in the MasterPage looks like this:
[Code]....
I am using a custom class to save and retrieve the state of the TreeView, the code is pasted below:
[Code]....
In my Page_Load on MasterPage I have:
[Code]....
where Reload() makes sure I'm loading the TreeView for the correct argument (based on a user selection) And in TreeView_Unload I have:
[Code]....
With all this in place, my TreeView is behaving almost as I want it.. I can expand the root node, it will be populated and I can browse to a new content page and have the same treeview appear in the MasterPage (with same expanded root)... BUT if I try to expand any of the 1st sublevel nodes, I end up with a completely collapsed treeview instead. After some debugging I have come to the conclusion that the "NodeExpanded" event gets the ROOT NODE as event argument instead of the 1st sublevel node that I clicked. When the user changes the option that makes the TreeView re-populate with new data, I simply do a "HttpContext.Current.Session("TreeViewState") = Nothing" to reset my saved state.
If you need more info / code snippets, let me know and I will post it.. But I felt there was no reason to post my complete source, as I have multiple files with about 500 lines of code each (there's a lot happening on the MasterPage, other than the TreeView)
I've created a dynamic button from another control outside of the update Panel. The button is given an ID and such. When the button is click, a postback occurs and I've re-created this button during Page_Init, Page_PreLoad, and Page_Onload and NONE of them is preserving the value.
The only way for me to find the control was to look at the Page.request.form's allkeys and compare the string with a any text string that contains: Button. Because I ID'd teh button as: ButtonRow_0Col0. But the actual ID is null. However, when traversing through page.request.form, the allkeys shows that ID with no problem.
So how come the actual ID is lost after a partial postback yet, the page.request.form's allkeys can pull out its allkey's value??
Ok so I have two listboxes on my page one for users and another for cases. For some reason the users listbox preserves state, but the cases listbox doesn't.
I tried setting them both to autopostback, but that didn't work. The users listbox would preserve the selected item, but make it the first viewable item in the list. The cases listbox still reset the selected item to the first.
My page load:
Code:
'.... If Not Page.IsPostBack Then ''Sort later. Dim i As Integer = 10 For Each usr As String In AttRoleProvider.GetUsersInRole("Role1") Me.ExistingUsers.Items.Add(usr)