将自定义 IHttpModule 添加到 web.config 会引发 500 错误
Adding Custom IHttpModule to web.config throws 500 error
我整天都在为这个非常基本的问题苦苦挣扎。从长远来看,我试图保留 .NETs Forms 身份验证,但将默认授权模块替换为自定义模块。
然而,在我到达那里之前,我只需要我的自定义 IHttpModule 被调用。
我从网上复制了这段代码作为开始的基本模板:
public class UrlAuthorizationModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
}
void context_AuthenticateRequest(object sender, EventArgs e)
{
var sting = "";
}
void context_AuthorizeRequest(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
if (context.Request.Url.AbsoluteUri.Contains("Oregon"))
return;
else
throw new UnauthorizedAccessException();
//if (context.User != null && context.User.Identity.IsAuthenticated)
//{
// HttpContext _httpContext = context.Context;
// SiteMapNode node = SiteMap.Provider.FindSiteMapNode(_httpContext);
// if (node == null)
// throw new UnauthorizedAccessException();
//}
}
public void Dispose()
{
}
}
然后我将其放入 web.config:
<system.web>
<httpModules>
<remove name="UrlAuthorization" />
<add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />
然而它根本没有被调用。什么也没发生。然后我意识到我可能使用的是iis7,所以我添加了这个:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorization" />
<add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />
<add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v17.2, Version=17.2.5.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A" name="ASPxHttpHandlerModule" />
不幸的是,一旦我在系统中添加 "add" 自定义标签。webServer/modules 网站将根本无法加载。相反,它会抛出一个通用的 500 错误。
Server Error
500 - Internal server error.
There is a problem with the resource you are looking for, and it
cannot be displayed.
据我所知,我的语法完全正确。 DevExpress 自定义模块工作正常,不会因此引发任何错误,所以我知道是我的添加导致了问题。如果我删除我的 "add" 行然后网站加载正确,它只是不调用我的自定义 IHttpModule。
系统日志中也没有显示任何内容。这一定是真的很愚蠢,我只是没有看到它。
编辑:
我在我的本地 win 10 开发机器上使用 Microsoft Visual Studio 2017(使用 IISExpress)。我确实在 C:\Users\username\Documents\IISExpress\TraceLogFiles\website\fr000001.xml 找到了一些 TraceLogFiles,里面就是这个错误。
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/>
<EventID>0</EventID>
<Version>1</Version>
<Level>3</Level>
<Opcode>16</Opcode>
<Keywords>0x100</Keywords>
<TimeCreated SystemTime="2018-11-13T15:25:30.609Z"/>
<Correlation ActivityID="{80001795-0008-FD00-B63F-84710C7967BB}"/>
<Execution ProcessID="41168" ThreadID="40824"/>
<Computer>machine name</Computer>
</System>
<EventData>
<Data Name="ContextId">{80001795-0008-FD00-B63F-84710C7967BB}</Data>
<Data Name="ModuleName">IIS Web Core</Data>
<Data Name="Notification">1</Data>
<Data Name="HttpStatus">500</Data>
<Data Name="HttpReason">Internal Server Error</Data>
<Data Name="HttpSubStatus">19</Data>
<Data Name="ErrorCode">2147942433</Data>
<Data Name="ConfigExceptionInfo">\?\C:\Users\username\Documents\websitepath\web.config ( 394) :Lock violation
</Data>
</EventData>
<RenderingInfo Culture="en-US">
<Opcode>MODULE_SET_RESPONSE_ERROR_STATUS</Opcode>
<Keywords>
<Keyword>RequestNotifications</Keyword>
</Keywords>
<freb:Description Data="Notification">BEGIN_REQUEST</freb:Description>
<freb:Description Data="ErrorCode">The process cannot access the file because another process has locked a portion of the file.
(0x80070021)</freb:Description>
</RenderingInfo>
<ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
<EventGuid>{002E91E3-E7AE-44AB-8E07-99230FFA6ADE}</EventGuid>
</ExtendedTracingInfo>
</Event>
据我所知,它抱怨 web.config 文件被另一个进程锁定。但这没有意义。为了安全起见,我将正在使用的开发端口从我使用的旧随机数更改为新的随机数,但没有任何影响。考虑到该站点在没有自定义模块的情况下工作,这意味着 web.config 文件基本权限是可以的。
我在 this post 中找到了答案。
出于某种原因,模块内的 "remove" 标签:
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorization" />
</modules>
不再允许在 system.webServer 内。而且抛出的错误不是很大。一旦我删除了该标签(留下两个自定义添加标签),网站至少又开始显示了。
This post 指向我可以修改的 applicationhost.config 文件
$(solutionDir).vs\config\applicationhost.config
<add name="UrlAuthorizationModule" lockItem="true" />
并将其替换为
<add name="UrlAuthorizationModule" lockItem="false" />
然后我就可以在本地web.config成功使用删除标签了。
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorizationModule" />
</modules>
我整天都在为这个非常基本的问题苦苦挣扎。从长远来看,我试图保留 .NETs Forms 身份验证,但将默认授权模块替换为自定义模块。
然而,在我到达那里之前,我只需要我的自定义 IHttpModule 被调用。
我从网上复制了这段代码作为开始的基本模板:
public class UrlAuthorizationModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
context.AuthorizeRequest += new EventHandler(context_AuthorizeRequest);
}
void context_AuthenticateRequest(object sender, EventArgs e)
{
var sting = "";
}
void context_AuthorizeRequest(object sender, EventArgs e)
{
HttpApplication context = (HttpApplication)sender;
if (context.Request.Url.AbsoluteUri.Contains("Oregon"))
return;
else
throw new UnauthorizedAccessException();
//if (context.User != null && context.User.Identity.IsAuthenticated)
//{
// HttpContext _httpContext = context.Context;
// SiteMapNode node = SiteMap.Provider.FindSiteMapNode(_httpContext);
// if (node == null)
// throw new UnauthorizedAccessException();
//}
}
public void Dispose()
{
}
}
然后我将其放入 web.config:
<system.web>
<httpModules>
<remove name="UrlAuthorization" />
<add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />
然而它根本没有被调用。什么也没发生。然后我意识到我可能使用的是iis7,所以我添加了这个:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorization" />
<add name="UrlAuthorizationModule" type="MyNamespace.UrlAuthorizationModule, common" />
<add type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.v17.2, Version=17.2.5.0, Culture=neutral, PublicKeyToken=B88D1754D700E49A" name="ASPxHttpHandlerModule" />
不幸的是,一旦我在系统中添加 "add" 自定义标签。webServer/modules 网站将根本无法加载。相反,它会抛出一个通用的 500 错误。
Server Error
500 - Internal server error.
There is a problem with the resource you are looking for, and it cannot be displayed.
据我所知,我的语法完全正确。 DevExpress 自定义模块工作正常,不会因此引发任何错误,所以我知道是我的添加导致了问题。如果我删除我的 "add" 行然后网站加载正确,它只是不调用我的自定义 IHttpModule。
系统日志中也没有显示任何内容。这一定是真的很愚蠢,我只是没有看到它。
编辑: 我在我的本地 win 10 开发机器上使用 Microsoft Visual Studio 2017(使用 IISExpress)。我确实在 C:\Users\username\Documents\IISExpress\TraceLogFiles\website\fr000001.xml 找到了一些 TraceLogFiles,里面就是这个错误。
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="WWW Server" Guid="{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"/>
<EventID>0</EventID>
<Version>1</Version>
<Level>3</Level>
<Opcode>16</Opcode>
<Keywords>0x100</Keywords>
<TimeCreated SystemTime="2018-11-13T15:25:30.609Z"/>
<Correlation ActivityID="{80001795-0008-FD00-B63F-84710C7967BB}"/>
<Execution ProcessID="41168" ThreadID="40824"/>
<Computer>machine name</Computer>
</System>
<EventData>
<Data Name="ContextId">{80001795-0008-FD00-B63F-84710C7967BB}</Data>
<Data Name="ModuleName">IIS Web Core</Data>
<Data Name="Notification">1</Data>
<Data Name="HttpStatus">500</Data>
<Data Name="HttpReason">Internal Server Error</Data>
<Data Name="HttpSubStatus">19</Data>
<Data Name="ErrorCode">2147942433</Data>
<Data Name="ConfigExceptionInfo">\?\C:\Users\username\Documents\websitepath\web.config ( 394) :Lock violation
</Data>
</EventData>
<RenderingInfo Culture="en-US">
<Opcode>MODULE_SET_RESPONSE_ERROR_STATUS</Opcode>
<Keywords>
<Keyword>RequestNotifications</Keyword>
</Keywords>
<freb:Description Data="Notification">BEGIN_REQUEST</freb:Description>
<freb:Description Data="ErrorCode">The process cannot access the file because another process has locked a portion of the file.
(0x80070021)</freb:Description>
</RenderingInfo>
<ExtendedTracingInfo xmlns="http://schemas.microsoft.com/win/2004/08/events/trace">
<EventGuid>{002E91E3-E7AE-44AB-8E07-99230FFA6ADE}</EventGuid>
</ExtendedTracingInfo>
</Event>
据我所知,它抱怨 web.config 文件被另一个进程锁定。但这没有意义。为了安全起见,我将正在使用的开发端口从我使用的旧随机数更改为新的随机数,但没有任何影响。考虑到该站点在没有自定义模块的情况下工作,这意味着 web.config 文件基本权限是可以的。
我在 this post 中找到了答案。
出于某种原因,模块内的 "remove" 标签:
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorization" />
</modules>
不再允许在 system.webServer 内。而且抛出的错误不是很大。一旦我删除了该标签(留下两个自定义添加标签),网站至少又开始显示了。
This post 指向我可以修改的 applicationhost.config 文件 $(solutionDir).vs\config\applicationhost.config
<add name="UrlAuthorizationModule" lockItem="true" />
并将其替换为
<add name="UrlAuthorizationModule" lockItem="false" />
然后我就可以在本地web.config成功使用删除标签了。
<modules runAllManagedModulesForAllRequests="true">
<remove name="UrlAuthorizationModule" />
</modules>