将自定义 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>