2014-09-05 32 views
7

背景的Application_BeginRequest没有在PUT API调用IIS服务器

上激发我有一个MVC应用程序与组件的WebAPI。我使用jQuery和AJAX来传递和接收来自WebAPI的数据。我在每次调用期间都依靠Application_BeginRequest来执行一些平凡的任务。

问题

的Application_BeginRequest始终闪光的GET和POST调用到的WebAPI。但是,当我将PUT调用到WebAPI时,Application_BeginRequest确实会触发而不是,导致应用程序不运行任务。 PUT调用实际上被接收,因为控制器中的相应方法正在执行。

我在我的web.config文件中启用了PUT(如下)。如何启用PUT方法调用来触发Application_BeginRequest方法?

注意: Application_BeginRequest在使用IIS Express时触发PUT调用,但在使用完整版本的IIS时触发。

项目:整个项目可以在这里下载: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

什么管理管道模式在IIS中设置? – 2014-09-09 07:00:49

+0

托管管道模式设置为集成,并且.Net Framework为4.0。 – MarkBarciak 2014-09-09 13:16:48

+0

什么版本的IIS? – 2014-09-09 19:34:29

回答

0

您的代码工作。不知道你的柜台,所以我把它改为:

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

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

(除去指出什么我改变其他代码)

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

记住页面上的计数器时不会更新你做AJAX调用 - 刷新页面后,你会看到计数器已经正确递增。

不知道你为什么要在Mvc项目中引用WebApi项目?我要么保持他们分开或加入他们到一个避免任何古怪。就个人而言,我的WebApi将完全独立,因为它不应该与任何其他Web应用程序有关 - 至少这是我设计数据API的方式。

1

转到IIS功能模式 - >单击处理程序映射 - >滚动列表并找到无扩展名URL处理程序 - >检查处理程序之前的所有处理程序,看看是否有其他东西注册到处理程序PUT请求因此在遇到无扩展url处理程序之前劫持PUT。希望有帮助

相关问题