2016-11-28 3 views
0

Я пытаюсь получить обработчик, вызываемый для корневого запроса сайта браузером, то есть http://my.example.com. Учитывая приведенный ниже код, если я вызываю/тестирую, обработчик работает так, как ожидалось, но без этого я получаю HTTP Error 403.14 - Forbidden (просмотр каталогов не допускается).Общий обработчик для корневого сайта

  • Windows Server 2012-R2/IIS 8.5
  • Там нет MVC Приглашена
  • ScriptModule-4,0 модуля наследуется так extensionless работает
  • Подобно this question с 2012 года, что было не правильно ответил
  • В качестве примера приводится общий обработчик ... также может быть веб-службой Soap

Я пробовал различные комбинации ns косой черты и звездочки для пути обработчика без успеха.

Общий обработчик:

Public Class Test 
    Implements IHttpHandler 

    Public Sub ProcessRequest(Context As HttpContext) _ 
     Implements IHttpHandler.ProcessRequest 

     With New StringBuilder 
      .AppendLine("<html>") 
      .AppendLine("<head>") 
      .AppendLine("<title>Test</title>") 
      .AppendLine("</head>") 
      .AppendLine("<body>") 
      .AppendLine("<p>Hello World</p>") 
      .AppendLine("</body>") 
      .AppendLine("</html>") 

      Context.Response.Write(.ToString) 
     End With 
    End Sub 
End Class 

... и в web.config у меня есть следующие:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <compilation strict="false" explicit="true" debug="true" targetFramework="4.5.2" /> 
     <customErrors mode="Off" /> 
     <authentication mode="Windows" /> 
     <httpRuntime targetFramework="4.5.2" /> 
    </system.web> 

    <system.webServer> 
     <handlers> 
      <add verb="*" name="Test" type="MyApp.Test" path="Test" /> 
     </handlers> 

     <defaultDocument enabled="true"> 
      <files> 
       <clear /> 
       <add value="Test" /> 
      </files> 
     </defaultDocument> 
    </system.webServer> 
</configuration> 

ответ

0

Решение, которое я придумал, но я открыт для других идей.

В web.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <system.web> 
     <compilation strict="false" explicit="true" debug="true" targetFramework="4.5.2" /> 
     <customErrors mode="Off" /> 
     <authentication mode="Windows" /> 
     <httpRuntime targetFramework="4.5.2" /> 

     <!-- Required for Web Services via Handlers --> 
     <webServices> 
      <protocols> 
       <add name="HttpGet" /> 
       <add name="HttpPost" /> 
      </protocols> 
     </webServices> 
    </system.web> 

    <system.webServer> 
     <handlers> 
      <add verb="GET,POST" name="Test" type="MyApp.Test" path="Test" /> 
     </handlers> 

     <modules> 
      <add name="AppModule" type="MyApp.AppModule" /> 
     </modules> 

     <defaultDocument enabled="false" /> 
     <directoryBrowse enabled="false" /> 
    </system.webServer> 
</configuration> 

А потом добавил класс AppModule где я оценить HttpContext.Current.Request.AppRelativeCurrentExecutionFilePath и сделать HttpContext.Current.RewritePath поэтому обработчик определен выше, будет забрать его.

  • my.example.com
  • my.example.com/AnyFolder/ MyApplication

Matching для "~/" работает, если веб-приложение находится в корне сайта в IIS или создается как приложение на сайте:

Public Class AppModule 
    Implements IHttpModule 

    Friend WithEvents WebApp As HttpApplication 

    Public Sub Init(ByVal HttpApplication As HttpApplication) _ 
     Implements IHttpModule.Init 

     WebApp = HttpApplication 
    End Sub 

    Private Sub WebApp_BeginRequest(sender As Object, e As EventArgs) _ 
     Handles WebApp.BeginRequest 

     With HttpContext.Current 
      If .Request.AppRelativeCurrentExecutionFilePath = "~/" Then .RewritePath("~/Test") 
     End With 
    End Sub 

    Public Sub Dispose() _ 
     Implements IHttpModule.Dispose 

     Throw New NotImplementedException() 
    End Sub 
End Class