昨天发布网站出了点问题 404 资源已被删除、已更名或暂时不可用。
这很奇怪,这个站点我部署了好几个,该服务器已经是第二次部署,因为客户服务器中病毒了,全部重新安装
我在别的客户上部署全部没有问题,就这一个出现了该问题,真的很郁闷
问题梳理:
1.iis安装是否出现问题,少了配置
2..NET FW是否安装3.0/4.0
3.ISAPI 和CGI限制是否允许
4.应用池程序是否修改成4.0/高级设置32位也可以开启


5.权限问题,发出的文件是否能被有效访问,有读写相关需求的用户组是够有足够的权限
6.访问文件出错,MIME类型里是否添加相应后缀名的扩展,没有添加即可

7.我遇到的问题
错误摘要
HTTP 错误 404.0 - Not Found
您要找的资源已被删除、已更名或暂时不可用。
详细错误信息
模块 IIS Web Core
通知 MapRequestHandler
处理程序 StaticFile
错误代码 0x80070002
请求的 URL http://xxx.xxx.x.xxx:8082/home/index
物理路径 D:\wenjian\home\index
登录方法 匿名
登录用户 匿名
最可能的原因:
指定的目录或文件在 Web 服务器上不存在。
URL 拼写错误。
某个自定义筛选器或模块(如 URLScan)限制了对该文件的访问
所有配置均已完成,这个问题的原因是在 IIS 7.0 中,对于使用 Url 路由 访问页面的 ASP.NET 应用程序,IIS可能会不能出 Url 是对 ASP.NET 的请求。会显示404/403之类的错误代码(路径不存在,或者不允许查看目录)
我用的方法比较粗暴:直接修改WEB.CONFING文件
<system.webServer>
<!--增加runAllManagedModulesForAllRequests="true" 即可--!>
<modules runAllManagedModulesForAllRequests="true" ></modules>
</system.webServer>
但是这么做是有点问题的
【别人写的 我直接贴过来了 不想自己写】
因为性能会浪费, 还有一些静态文件的请求可能会被要求验证 (比如图片是可以含有 & 符号的, 但是你设置了这个, 就会被验证成 invalid 了),这样会让所有的请求都要经由 .NET 来处理,不管是什么路径文件,这样确实能解决当前的问题。一方面会让 .NET 比较累,所有静态文件请求也需要处理。另一方面,也可能会让程序的内容变得更复杂,比如如果有代码会根据请求的 Url 来处理一些事情。
网上还有别的替代方法
【直接贴的网友的】
找到了一个看起来比较好的解决方案。如上图所示,Url 路由是由 UrlRoutingModule 这个模块来处理的。在某些 IIS 版本中,并不会将所有请求交给 UrlRoutingModule 处理,所以,我们可以在 Web.config 中进行如下设置:
首先移除掉原有的 UrlRoutingModule,然后再添加一下,不过这次添加将把 preCondition 设为空.
<system.webServer> <modules> <remove name="UrlRoutingModule-4.0" /> <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> </modules> </system.webServer>
当然上述方法有一个小问题
在Asp.Net WebApi 项目中使用OWIN模块之后,如果没有在OWIN的Startup类中配置认证方式,调用WebApi的相关Controller和Action就会出现异常:
没有 OWIN 身份验证管理器与此请求相关联。 ExceptionType:System.InvalidOperationException StackTrace: 在 System.Web.Http.Owin.PassiveAuthenticationMessageHandler.SuppressDefaultAuthenticationChallenges(HttpRequestMessage request) 在 System.Web.Http.Owin.PassiveAuthenticationMessageHandler.<SendAsync>d__0.MoveNext() --- 引发异常的上一位置中堆栈跟踪的末尾 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 在 System.Web.Http.HttpServer.<SendAsync>d__0.MoveNext()
解决方法有两个:
第一:在OWIN的Startup类中指定默认的认证方式,我们将上面的Startup类代码改为下面的代码,在Configuration方法中为指定认证方式为Cookie认证。
using System; using System.Collections.Generic; using System.Linq; using Microsoft.Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.Cookies; using Owin; [assembly: OwinStartup(typeof(Daimler.CdnMgmt.Web.Startup))] namespace Daimler.CdnMgmt.Web { public partial class Startup { public void Configuration(IAppBuilder app) { app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); app.UseCookieAuthentication(new CookieAuthenticationOptions()); } } }
第二:在Asp.Net WebApi的全局配置文件WebApiConfig.cs中取消调用SuppressDefaultHostAuthentication方法,来启用Host的默认身份认证,如下代码所示。当然如果项目中本来就没有代码调用SuppressDefaultHostAuthentication方法,就不用考虑这个解决方法了。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Cors;
using Daimler.CdnMgmt.Web.Utils;
using Microsoft.Owin.Security.OAuth;
using Newtonsoft.Json.Serialization;
namespace Daimler.CdnMgmt.Web
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
//config.SuppressDefaultHostAuthentication();//取消调用SuppressDefaultHostAuthentication方法,恢复Host的默认身份认证
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new {id = RouteParameter.Optional}
);
}
}
}
当然如果你的ASP.NET项目中没有安装或者丢失了NuGet包:Microsoft.Owin.Host.SystemWeb,但是又使用了OWIN框架,也会出现本文所述的错误,只要重新安装NuGet包:Microsoft.Owin.Host.SystemWeb即可。
暂时我用的是不替换方式直接,看个人选择
<modules runAllManagedModulesForAllRequests="true" ></modules>
博客介绍了在IIS 7.5中遇到404错误时的排查步骤,包括检查IIS配置、.NET Framework、ISAPI限制、应用池设置、权限、MIME类型和Web.config配置。作者分享了直接修改Web.config的解决方法,但也指出这种方法可能带来的性能问题,并提供了其他替代方案,涉及UrlRoutingModule和OWIN认证设置。
838

被折叠的 条评论
为什么被折叠?



