将自定义IHttpModule添加到web.config会引发500错误

时间:2018-11-09 22:40:47

标签: .net iis-7 httpmodule

我整天都在为这个非常基本的问题而苦苦挣扎。长期来看,我试图保持.NETs Forms身份验证,但是用自定义模块替换默认的Authorization模块。

但是,在到达那里之前,我只需要调用自定义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" />

不幸的是,一旦我在system.webServer / modules中添加“ add” customtag,那么该站点将根本无法加载。相反,它将引发通用500错误。

  

服务器错误

     

500-内部服务器错误。

     

您正在寻找的资源有问题,并且它   无法显示。

据我所知,我的语法都是正确的。 DevExpress定制模块正在正常工作,因此不会引发任何错误,因此我知道是我的添加引起了问题。如果我删除“添加”行,则该站点将正确加载,只是不会调用我的自定义IHttpModule。

系统日志中也没有显示任何内容。它一定是真的很愚蠢,我只是看不到。

编辑: 我在本地Win 10开发机器上使用Microsoft Visual Studio 2017(使用IISExpress)。我确实在以下位置找到了一些TraceLogFiles:C:\ Users \ username \ Documents \ IISExpress \ TraceLogFiles \ website \ fr000001.xml,里面就是这个错误。

<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文件的基本权限是可以的。

1 个答案:

答案 0 :(得分:0)

我设法在this post中找到了答案。

由于某些原因,模块内部的“删除”标签:

<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中成功使用remove标签。

<modules runAllManagedModulesForAllRequests="true">
  <remove name="UrlAuthorizationModule" />
</modules>