2014-09-05 13 views
7

SfondoApplication_BeginRequest non essere licenziati durante le chiamate API PUT su server IIS

Ho un'applicazione MVC con una componente WebAPI. Sto usando jQuery e AJAX per passare e ricevere dati da WebAPI. Mi affido alla richiesta di Application_BeginRequest durante ogni chiamata per eseguire attività banali.

Problema

Application_BeginRequest spara sempre per GET e POST chiamate al WebAPI. Tuttavia, quando effettuo la chiamata PUT alla WebAPI, Application_BeginRequest fa non attiva, causando l'esecuzione dell'applicazione non eseguita. La chiamata PUT viene effettivamente ricevuta, poiché viene eseguito il metodo corrispondente nel controller.

Ho PUT abilitato nel mio file web.config (sotto). Come posso abilitare le chiamate al metodo PUT per attivare il metodo Application_BeginRequest?

Nota: Application_BeginRequest si attiva per le chiamate PUT quando si utilizza IIS Express, ma non quando si utilizza la versione completa di IIS.

Progetto: Il progetto completo può essere scaricato qui: BeginRequestFail.zip

Web.Config

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <pages> 
     <namespaces> 
     <add namespace="System.Web.Helpers" /> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Optimization" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="System.Web.WebPages" /> 
     </namespaces> 
    </pages> 
    </system.web> 
    <system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="PassThrough"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <remove statusCode="403" subStatusCode="-1" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="404" path="/Error/404" responseMode="ExecuteURL" /> 
     <error statusCode="403" path="/Error/403" responseMode="ExecuteURL" /> 
     <error statusCode="500" path="/Error/500" responseMode="ExecuteURL" /> 
    </httpErrors> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules> 
     <remove name="UrlRoutingModule-4.0" /> 
     <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition="" /> 
     <remove name="WebDAVModule"/> 
    </modules> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
    </system.webServer> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="DotNetOpenAuth.Core" publicKeyToken="2780ccd10d57b246" /> 
     <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="DotNetOpenAuth.AspNet" publicKeyToken="2780ccd10d57b246" /> 
     <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.1.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="WebGrease" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-1.3.0.0" newVersion="1.3.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
      <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" culture="neutral" /> 
      <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Global.asax.cs

protected void Application_BeginRequest(object sender, EventArgs e) //Not triggered with PUT 
     { 
      Application["BeginRequest"] = _Scounter++; 
     } 
+0

Quale modalità di pipeline gestita è impostata in IIS? –

+0

La modalità pipeline gestita è impostata su integrata e .Net Framework è 4.0. – MarkBarciak

+0

Quali versioni di IIS? –

risposta

0

Le tue opere di codice . Non sei sicuro di vostro contatore, quindi l'ho cambiato in:

public class MvcApplication : System.Web.HttpApplication 
{ 
    public static int BeginRequestCounter = 0; 

    protected void Application_BeginRequest(object sender, EventArgs e) 
    { 
     BeginRequestCounter++; 
    } 
} 

(altro codice rimossa per sottolineare ciò che ho cambiato)

<p>@BeginRequestFail.MvcApplication.BeginRequestCounter</p> 

Tenete a mente il contatore sulla pagina non si aggiorna quando fai le chiamate AJAX - dopo un aggiornamento della pagina vedrai che i contatori sono stati incrementati correttamente.

Non sei sicuro del motivo per cui vuoi fare riferimento a un progetto WebApi in un progetto Mvc? Li terrei separati o li unirò in uno per evitare stranezze. Personalmente il mio WebApi sarebbe completamente separato in quanto non dovrebbe avere nulla a che fare con qualsiasi altra app web, almeno questo è il modo in cui disegnerei la mia API di dati.

1

Passare alla modalità Funzionalità IIS -> Fare clic su Mapping gestori -> Scorrere l'elenco e individuare Gestore URL senza estensioni -> Controllare tutti i gestori prima di quel gestore per vedere se qualcos'altro è registrato per il gestore Richiesta PUT quindi dirottare PUT prima che colpisca il gestore url senza estensione. Spero che questo aiuti