IIS returns 404 for ASP.NET MVC3 file (.cshtml

2019-03-25 21:51发布

问题:

I have standard ASP.NET 4 application. Inside this application there are also few razor (e.g. test.cshtml) files. ASP.NET application works however if I point browser to /test file (without extension). IIS (static file handler) returns 404.

The same application and even the standalone .cshtml files are working on local machine (with IIS7.5/Win7) and a server with (IIS7.5/Win2008R2), however it does not work the server with IIS7.0/Win2008.

MVC3 is installed on both machines, app pools on both machines are .NET 4.0 integrated.

How the .cshtml handlers works? When the IIS decides to use static file handler and when the .cshtml handler? What else should I check?

EDIT:

Clarification - I am not actually using whole MVC framework, it is just like plain-old .ASPX or PHP file. No controllers, no routes, no 'views'. I am using it for a simple script in addition to old ASP.NET application.

I think it is not a programming issue, since it works on local computer, but rather a configuration issue - the IIS on the Win2008 server might not be configured properly.

EDIT2:

(Machines with IIS7.5 works, only machine with IIS7.0 does not work. But I am not sure whether it is a problem of IIS version.)

EDIT3:

On my local computer where it works, I have not set any routing. TheCodeKing and Keith suggested that I need to have a routing somewhere. Maybe yes, but it is not in my application. It might be set by default somewhere in IIS configuration.

Do you have any hints where this 'implicit' routing could be found?

EDIT4:

Note: On all computers there is HttpForbiddenHandler for *.cshtml, since you cannot download the cshtml file. And there is also the TransferRequestHandler for *.. (Both are enabled.)

EDIT5:

I have found that on the servers, where it is working, I need to have any .cshtml file in the web root. If I remove the .cshtml from the web root and try to invoke any from a subdirectory it will not work.

EDIT6:

I tried that on another two machines: one with IIS 7.5 and another with IIS 7.0. On IIS 7.5 it works (plain install no configuration), but on IIS 7.0 it does not work.

How to make it work on IIS 7.0?

回答1:

Yay! After several days of struggling I've found it! :))

One way to make it work on IIS 7.0 is to enable runAllManagedModulesForAllRequests:

<modules runAllManagedModulesForAllRequests="true" />

(Although, on IIS 7.5 it works even with the default value runAllManagedModulesForAllRequests="false".)

Don't ask me why:) Maybe someone can explain that.



回答2:

Not sure if this is your particular problem, but it sounds like ASP.NET Web Pages isn't running (MVC 3 and up depend on Web Pages for Razor and other things). Sometimes things can get installed in orders that mess up some configuration of ASP.NET and IIS, which in turn could make it so Web Pages isn't running and no cshtml file will get executed.

Try running aspnet_regiis /i to clean it all up.



回答3:

There is an hotfix for IIS7.0 available at: http://support.microsoft.com/kb/980368

I installed it today on windows 2008 SP2 (which requires an OS restart). The behavior in IIS 7.0 is now similar than IIS 7.5

It fixed the problem on my side / without forcing:

<modules runAllManagedModulesForAllRequests="true" />

This is a better approach than running all modules for any request (even on css/images/...) which would cause unnecessary overload.



回答4:

Are you sure that IIS has sufficient permissions to access the file under the /test directory?

This could cause some silly issues as I've found.



回答5:

If this is an asp.net 4.0 web application, you will need to manually set up routes, create the appropriate controller(s), and make sure that your views (.cshtml files) actually exist in the /Views/ControllerName folder.

I would also recommend setting up your project to use IISExpress in your development environment to more closely match your web server. It's a great help when debugging these sort of issues.



回答6:

As you aren't using MVC, you would need to set up routing, or rewriting using IIS rewrite module to expect /test to resolve to /test.cshtml. You won't get this behaviour without it.

e.g. something like this in your application start.

routes.MapPageRoute(
   "extension-less paths",
   "{view}",
   "~/{view}.cshtml"
);


回答7:

cshtml can work, if you set a web.conf.

You can think it is a html but with razor syntax.