2014-09-05 8 views
7

фонApplication_BeginRequest не увольняют во время PUT API вызовов на сервере IIS

У меня есть MVC приложение с компонентом WebAPI. Я использую jQuery и AJAX для передачи и получения данных из WebAPI. Я полагаюсь на приложение Application_BeginRequest, которое запускается во время каждого вызова для выполнения какой-то мирской задачи.

Проблема

Application_BeginRequest всегда срабатывает для GET и POST вызывает к WebAPI. Однако, когда я делаю PUT-вызов в WebAPI, Application_BeginRequest делает не пожара, в результате чего приложение не запускает задачу. Ответ на вызов PUT фактически получен, потому что выполняется соответствующий метод в контроллере.

У меня включен PUT в файле web.config (см. Ниже). Как включить вызовы метода PUT для запуска метода Application_BeginRequest?

Примечание: Приложение_BeginRequest запускает вызовы PUT при использовании IIS Express, но не при использовании полной версии 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? –

+0

Режим управляемого порта установлен на Интегрированный, а .Net Framework - 4.0. – MarkBarciak

+0

Какие версии IIS? –

ответ

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 - после обновления страницы вы увидите, что счетчики увеличились правильно.

Не знаете, почему вы хотите ссылаться на проект WebApi в проекте Mvc? Я бы либо держал их отдельно, либо присоединял их к одному, чтобы избежать какой-либо странности. Лично мой WebApi был бы полностью разделен, так как он не должен иметь ничего общего с каким-либо другим веб-приложением - по крайней мере, именно так я буду разрабатывать свой API данных.

1

Перейти к описанию функций IIS -> Щелкните на списке обработчиков -> Прокрутите список и найдите обработчик URL без растягивания -> Проверьте все обработчики перед этим обработчиком, чтобы узнать, зарегистрировано ли какое-либо другое для запроса PUT-обработчика захват PUT до того, как он удалит обработчик url ​​без расширения. Надеюсь, что поможет