Custom Errors for "App" folders? (ASP.NET) - asp.net

Where can I setup custom errors for directories in my application such as App_Code, App_Browsers, etc.? I already have customErrors configured in the web.config and that works as expected. For example,
http://www.mysite.com/bla.aspx > redirects to 404 page
but
http://www.mysite.com/App_Code/ > displays "The system cannot find the file specified."
There's no physical App_Code directory for my site. Is this something that I can change in IIS?

You are trying to server content from an Protected Folder... ??
I think you might need to allow access to these folders to get the nice errors you are looking for...
http://www.webdavsystem.com/server/documentation/hosting_iis_asp_net/protected_folders
That being said... there is a reason these folders are protected.
I would never put anything i needed IIS to serve in protected folders.
But there are always reasons to do do something? i have broke a few rules in my short lifespan :)
UPDATE:
Found this when i tried this locally: http://support.microsoft.com/kb/942047/
Looks like those reserved directories throw special 404's you might be able to get IIS to Target the 404.8 type... with out opening up serving to those directories

I believe you will need to set the error pages in IIS itself, as the requests you talk about never reach the ASP.NET application. The reason your first example works is because IIS recognises the .ASPX extension and forwards it to ASP.NET.

One way is to provide a redirect in the global.asax file:
void Application_Error(object sender, EventArgs e)
{
//uncomment this to narrow down 'helpful' microsoft messages
//HttpRequest request = ((HttpApplication)sender).Context.Request;
Exception ex = Server.GetLastError();
//ErrorManager is a custom error handling module
ErrorManager.ProcessError(ex);
Response.Redirect("~/error.aspx?error=" + HttpUtility.UrlEncode(ex.Message), true);
}
{ On a side note, I was getting an exception that I just couldn't track down - it just said 'file not found' but didn't say which file was missing. It turned out to be a broken image reference in a css file - breaking on line two of the code above helped identify the missing file }

Add a Wildcard Mapping to IIS to run ALL Requests through ASP.net, then you can use Global.asax to handle the error.
Taken from here:
Follow these steps to create a wildcard script map with IIS 6.0:
Right-click a website and select Properties
Select the Home Directory tab
Click the Configuration button
Select the Mappings tab
Click the Insert button (see Figure 4)
Paste the path to the aspnet_isapi.dll into the Executable field (you can copy this path from the script map for .aspx files)
Uncheck the checkbox labeled Verify that file exists
Click the OK button

Related

Not able to download file name containing 'aspx' character in asp .net

Am developing asp .Net web application.
In one of my aspx file am using file to download using generic handler. Everything works great. But when am testing i felt a strange problem. That, if am uploading a image or document with file name containing aspx character for Eg; aspxphoto as file name.
Uploading doesnt have any any problem but when i try to download it is throwing error in Generic handler file as
Object reference not set to an instance of an object.
Can anyone help me why this problem happends and how can i fix it?
You will not be able to do this. The IIS handler wants to "handle" the ASPX. You should simply not allow it, or if you have to, rename it to .aspx.uploaded or something. If you allowed, it you could open yourself to hacking.
As another option, you may be able to create a virtual that implements ("no processing") - possibly using the HTTP Handler under the virtual and just disabling script / execute permissions (under handler >> Edit Feature Permission >> Script OR under Virtual >> Edit permissions >> Special >> Turn Execute off.
I would not recommend the last, since it will add complexity when migrating between test and live AND for recovery (DR).

How to add the Project root to the localhost path

My asp.net project, currently runs from http://localhost:51143/default.aspx
Is there anyway, I could include the root to this like http://localhost:51143/TOrders/default.aspx The reason I want to do this is because the URls that get called on the menu click events refer to "TOrders/Reports/aaa.aspx and so on and in production it would refer to intranet/TOrders/Reports/aaa.aspx and so on.
One solution could be to intercept every request in Application_BeginRequest method in Global.asax.
There you can create a rule to remove TOrders/ from the beginning. Try something like this:
void Application_BeginRequest(object sender, EventArgs e)
{
if (Request.RawUrl.StartsWith("TOrders/"))
Server.Transfer(Request.RawUrl.Substring(8));
}
This may not the nicest solution, but it should be enough to give you idea what to do.
Edit:
Since you have web project (not a web site), you can set virtual path of your project. I think this is what you are looking for.
If you are using VS2010, in Solution explorer right click on your project and chose Properties, then on Web tab, in Servers section, change virtual path of your project to /TOrders/ instead of / which is default value. Now you should get http://localhost:51143/TOrders/default.aspx
You need HttpRequest.ApplicationPath property
or HostingEnvironment.ApplicationVirtualPath property.
Also useful for building virtual paths is VirtualPathUtility class.
EDIT:
Try to copy your project into a subfolder of you web root, for eg. in IIS:
C:\inetpub\wwwroot\ (or what you set)
C:\inetpub\wwwroot\MyProject\
Now in IIS Managment Console, in your Default Web, you create a new 'Application'. Either you upgrade the existing folder or you create a virtual new one to your folder.
Then select a virtual path (TOrders) and set the physical path. There you will also set the AppPool if you have .NET 4, or select the runtime if you have 2.0/3.5 on IIS6.x. Try the highest version first...
Go to localhost/TOrders/

Access to the path 'c:\windows\system32\inetsrv\19.xml' is denied

I have a grid view on page. When i click on a select button of grid view. I am getting an exception like this
Error Message: Access to the path 'c:\windows\system32\inetsrv\19.xml' is denied.
here 19 is the id of the record in the grid view.
Actually it was working fine till yesterday. but suddenly raised the exception.
Every thing here is done by a web service.Web service works fine on all pages but only on one page.The exception is raises only on production system not on development system
It is occurring on only one page. How to resolve this.
Check your create/write/reading rights on the folder the xml is in.
Your application pool identity probably does not have the appropriate rights to create/modify/open the file, causing this error to occur.
Please check the security settings and see if that fixes the error.
You need to use Server.MapPath if xml documents are located under the root of web-app.
string value="19.xml";
string file=Server.MapPath("~/folder/" + value);
...
Try to move your XML data to a DataTable.. hence remove neediness to access directly your file. When everything is done simply save back your changes into the respective xml file.

Is it possible to only have a global.asax file in an asp.net application?

I have a root directory on a web server that is linked to a number of URLs. I want to use the application begin request event of a global.asax file to divert requests to the directories containing the content for the relevant web sites. So in psuedo code terms something like this -
If URL.Contains("www.somthing.com") Then divert user to directory x
If URL.Contains("www.somthingelse.com") Then divert user to directory y
I thought I'd be able to accomplish this by just dropping a global.asax file with the relevant code into the web servers root directory (I want to avoid complications such as a web.config file as it's contents will affect other applications I have in sub directories).
Unfortunately, this approach does not seem to work as the application begin request event doesn't appear to fire. I've got round the problem by adding a default.aspx file and making it the default document for the root directory. This appears to work, I presume this is because asp.net compiles the default.aspx file and in turn compiles the global.asax file which allows the events to fire?
Is my workaround the best way to accomplish what I need to do or is there a simpler way to get the global.asax events to fire using a single file?
Sounds like you're looking for a Host Header based redirection.
You can accomplish this by configure your
ISA Server like this or your IIS like this.

asp.net site default document in subfolder

My default document is in subfolder not in root how can i make it default in asp.net 2.0 website.
Tried iis7 default document setting to '/pages/default.aspx'
'~/pages/default.aspx' but it didn't work.
Default document is not the same as start page. Default document means if I requested mysite.com/somefolder and didn't specify a file, which file should IIS display.
If you want to use a specific page as your home page, create a Default.aspx file and write this in it's codebehind class:
public override void ProcessRequest(HttpContext context) {
context.Response.Redirect("pages/default.aspx", true);
}
As the client might have disabled Javascript, a server side approach would be more reliable. However it's best to issue a permanent redirect instead of a simple Response.Redirect. Also doing it using JS will be bad from a SEO point of view.
You don't need to create a dummy Default.aspx page.
In your Global.asax.cs file, write the following:
public void Application_Start(object sender, EventArgs e)
{
var routeCollection = RouteTable.Routes;
routeCollection.MapPageRoute("DefaultRoute", string.Empty, "~/YourDesiredSubFolder/YourDesiredDocument.aspx");
}
Explanation:
Application_Start code is guaranteed to run once and only once on the application start.
The first line of code, gets a collection of the URL routes for your application.
The second line of code, defines a new route pointing to your inner page in the subfolder that you wish.
The second argument is empty to indicate that this route is used when there's no specific page is requested and there's no Default document existing.
Default documents are a subfolder-specific thing - what you're trying to do won't (directly) work. Set up a default.htm file in the root, and have it refresh to your real "home page".
The better question you should be asking is how on Earth your homepage got out of the root directory.
In theory you could have a Web.config file inside the directory and use the defaultDocument element to set the default document. See here: https://stackoverflow.com/a/2012079/125938.
Unfortunately I haven't been able to get it to work myself locally, but that might be because it isn't supported in the Visual Studio development server.
Say "index.html" is the default page you want and it is present in "Public" subfolder.
Instead of specifying "/Public/index.html" as the default site, try "Public/index.html"

Resources