我遇到了我构建的自定义错误处理程序的麻烦.它应该是a HttpModule,但当我将它添加到我web.config的system.webServer/modules标签时,它不会被启动.
这是我的web.config部分:
<system.webServer>
<modules>
<add name="AspExceptionHandler"
type="Company.Exceptions.AspExceptionHandler, Company.Exceptions"
preCondition="managedHandler" />
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
这是我的代码HttpModule:
using System;
using System.Web;
using Company.Settings;
using System.Configuration;
namespace Company.Exceptions
{
public class AspExceptionHandler : IHttpModule
{
public void Dispose() { }
public void Init(HttpApplication application)
{
application.Error += new EventHandler(ErrorHandler);
}
private void ErrorHandler(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;
HttpContext currentContext = application.Context;
// Gather information5
Exception currentException = application.Server.GetLastError();
String errorPage = …Run Code Online (Sandbox Code Playgroud) 通常我们应该控制我们的AppPools并能够强制管理管道模式.在我的情况下,我没有控制权,并希望根据托管流水线模式(集成与经典)实现代码背后的代码.我只是不知道如何检测到这一点.有没有一种简单的方法可以在页面后面的代码中执行此操作?
虽然我已将contentlength的限制设置为大约4GB,但最大值如下所示
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="4294967295">
</requestLimits>
</requestFiltering>
</security>
<httpRuntime targetFramework="4.5" requestValidationMode="2.0"
requestPathInvalidCharacters="" maxRequestLength="5024000" executionTimeout="3600" />
Run Code Online (Sandbox Code Playgroud)
我收到了以下错误
HTTP错误400.0 - 错误请求
ASP.NET在URL中检测到无效字符.
我找到了一个链接,提到了这种行为的原因
如果应用程序在NET 4.5集成管道下运行,则上传将无法在2G以上运行,并且IIS将发送以下错误:"HTTP 400.0 - 错误请求ASP.NET在URL中检测到无效字符.".
当使用集成管道时,我们通过webengine代码(webengine4!MgdGetRequestBasics),它不支持超过2 GB的内容长度,并引发System.ArithmeticException异常,随后导致HTTP 400错误.使用经典管道,我们不使用webengine4,而是使用旧的ASPNET_ISAPI模型,我们没有遇到上述问题.
想在IIS 10和.net framework 4.5中询问它是否仍然有效.
有没有可以设置的设置来解决这个问题?
在IIS 6中,我们曾经使用两个第三方组件进行Url Rewriting:Helicon(用于处理无扩展网址)和UrlRewriting.net.前段时间我们迁移到IIS 7 - 经典模式,仍然使用这两个组件.
现在我们尝试使用本机.Net路由切换到没有第三方组件的集成模式.路由工作正常,但我们的Web应用程序表现完全不同.我们的网络服务器曾经保持低于10%的CPU使用率,但现在很容易使用50%甚至更高.
我们已经开始分析内存转储,但似乎没有找到问题的根源.似乎.Net缓存机制正在阻止垃圾收集器?这与使用"集成模式"有什么关系?
您可以在下面找到我们分析的摘录.任何关于下一步的建议都将不胜感激.
> !analyze -v -hang
*****************************
*
* Exception Analysis
*
*****************************
GetPageUrlData failed, server returned HTTP status 404
URL requested: http://watson.microsoft.com/00000000.htm?Retriage=1
FAULTING_IP:
+aceb6a0
00000000`00000000 ?? ???
EXCEPTION_RECORD: ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 0000000000000000
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 0
FAULTING_THREAD: 0000000000000022
BUGCHECK_STR: HANG
PROCESS_NAME: w3wp.exe
ERROR_CODE: (NTSTATUS) 0xcfffffff - <Unable to get error code text>
EXCEPTION_CODE: (NTSTATUS) 0xcfffffff - <Unable to get error code text>
MOD_LIST: <ANALYSIS/>
NTGLOBALFLAG: …Run Code Online (Sandbox Code Playgroud) asp.net performance iis-7 memory-dump integrated-pipeline-mode
<httpHandlers>
<add path="ajaxpro/*.ashx" verb="POST,GET" type="AjaxPro.AjaxHandlerFactory, AjaxPro.2" />
<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false" />
<remove verb="*" path="*.asmx" />
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
</httpHandlers>
Run Code Online (Sandbox Code Playgroud)
我在集成模式下遇到了iis7.5的问题.当我在经典模式处理程序中使用它时,上面提到的工作正常,但如果我切换到集成管道 - 所有应该处理的请求返回404错误.为什么?
我搜索得很高,仍然无法找到明确的答案.
如何在IIS中配置IIS 7.0 Web应用程序,使ASP.NET运行时将处理所有的请求-包括那些像静态文件*.js,*.gif等等?
我想要做的是如下.
我们有一种SaaSy网站,我们可以为每个客户"品牌化"."品牌"意味着开发自定义母版页并使用一堆*.css和其他图像.
很自然,我正在使用VirtualPathProvider,其运作方式如下:
public override System.Web.Hosting.VirtualFile GetFile(string virtualPath)
{
if(PhysicalFileExists(virtualPath))
{
var virtualFile = base.GetFile(virtualPath);
return virtualFile;
}
if(VirtualFileExists(virtualPath))
{
var brandedVirtualPath = GetBrandedVirtualPath(virtualPath);
var absolutePath = HttpContext.Current.Server.MapPath(brandedVirtualPath);
Trace.WriteLine(string.Format("Serving '{0}' from '{1}'",
brandedVirtualPath, absolutePath), "BrandingAwareVirtualPathProvider");
var virtualFile = new VirtualFile(brandedVirtualPath, absolutePath);
return virtualFile;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
基本思路如下:我们branding的webapp中有一个文件夹,其中包含每个"品牌"的文件夹,其中"品牌"等于主机名.也就是说,请求http://foo.example.com/应该使用静态文件branding/foo_example_com,而http://bar.example.com/应该使用来自的内容branding/bar_example_com.
现在我想要IIS做的是将所有请求转发到静态文件StaticFileHandler,然后使用整个"基础结构"并提供正确的文件.但是,尽我所能,我无法配置IIS来执行此操作.
在浏览虚拟主机/网站设置面板时,我遇到了这个

我什么时候会选择管道选项而不是非管道选项?
我在 IIS 8.5 上运行的(Web 窗体)站点上工作,并且目前正在设置 404 和 500 的错误处理。
我已经有了system.web>customErrors设置,但是由于我们在集成模式/较新版本的 IIS 下运行,因此它是从system.webServer> 中提取的httpErrors。
使用 IIS GUI,我选择在站点上用静态 HTML 文件替换标准 IIS 错误页面:
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" prefixLanguageFilePath=""
path="/problem.html" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" prefixLanguageFilePath=""
path="/problem.html" responseMode="ExecuteURL" />
</httpErrors>
Run Code Online (Sandbox Code Playgroud)
不幸的是,虽然显示了正确的错误页面,但不是返回 404,而是返回 200,对于 500 个错误,返回 302 后跟 200。
对于旧版本的 IIS 或未在集成模式下运行的 IIS,您可以redirectMode="ResponseRewrite"在customErrors元素上进行设置,这将解决此问题。
我试过设置existingResponse上httpErrors对所有三个可用的选项,以及尝试更新的设置responseMode="File",但这些什么也没有改变。
有没有办法对httpErrrors元素做类似的事情?或者我是否坚持将错误指向 ASP.NET 页面并从那里返回适当的错误? …
我正在试验IIS7中静态内容的集成身份验证模式.我按照本文中的说明操作:http://aspnet.4guysfromrolla.com/articles/122408-1.aspx 如果我通过登录状态允许/拒绝访问(如文章中所述),它工作正常.但是,我想基于角色允许/拒绝访问(使用内置于角色提供程序中的ASP.NET).当我为web.config中的角色"Admin"设置允许规则并拒绝所有其他用户的规则时,即使我以管理员身份登录,我也无法访问静态文件.同一文件夹包含非静态内容(aspx页面),可根据角色提供程序信息进行访问.
有任何想法吗?
我们的代码依赖于检查Global.asax Application_AuthenticateRequest(...)方法中的Context.User.Identity值来检索有关登录用户的一些信息.这在经典模式下工作正常但是当我翻转IIS以使用集成管道"Context.User"返回为null时,但只是间歇性地返回.有什么想法吗?
我有<authentication mode ="Windows">并且只在虚拟目录中启用了Windows Auth.
asp.net iis-7 windows-authentication integrated-pipeline-mode
在IIS7集成模式下,特别是在ASP.NET MVC和.NET4中,所有模块都针对所有请求运行.runAllManagedModulesForAllRequests = "真".使runAllManagedModulesForAllRequests ="false"给我带来了很多问题,直到我感到困惑为止.
所以为了简单起见,让我的模块接受包括静态文件在内的所有请求,但是在像BeginRequest这样的模块中,我只想处理它不是静态文件.如何过滤或检查模块中的这种情况?
asp.net ×10
iis-7 ×9
c# ×2
httpmodule ×2
.net-4.5 ×1
iis ×1
iis-10 ×1
iis-8.5 ×1
memory-dump ×1
performance ×1
pipeline ×1
static-files ×1
web-hosting ×1