2015-07-08 3 views
0

Я пишу пользовательский обработчик для обработки запросов с помощью глагола OPTIONS.Можно ли выбрать пользовательский обработчик по запросу?

public class OptionsRequestHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     string origin = context.Request.Headers.Get("Origin"); 
     context.Response.AddHeader("Access-Control-Allow-Origin", origin); 
     context.Response.AddHeader("Access-Control-Allow-Methods", "*"); 
     context.Response.AddHeader("Access-Control-Allow-Headers", "accept, authorization, content-type"); 
    } 

    public bool IsReusable 
    { 
     get { return false; } 
    } 
} 

И зарегистрировали этот обработчик в web.config.

<system.webServer> 
<modules> 
    ...... 
</modules> 
<handlers> 
...... 
    <add name="OptionsHandler" path="*" verb="OPTIONS" type="REAMS.Infrastructure.RequestHandlers.OptionsRequestHandler"/> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,DELETE,PUT,HEAD" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
</handlers> 

Но обработчик никогда не выбран для вариантов запросов. Что-то не так? Благодаря!

ответ

0

Наконец-то выяснилось, что эта проблема. Поскольку по умолчанию MVC-каркасная карта запрашивает обработчик по пути, невозможно сопоставить обработчик запросу запроса глаголом запроса.

Для этого мне нужно будет упредить выбор обработчика MVC и реализовать собственный модуль. Вот рабочая копия для всех желающих.

public class OptionsVerbModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PostRequestHandlerExecute += onPostRequestHandlerExecute; 
     context.PostResolveRequestCache += onPostResolveRequestCache; 
    } 

    private void onPostResolveRequestCache(object sender, EventArgs eventArgs) 
    { 
     if (string.Equals(HttpContext.Current.Request.HttpMethod, "OPTIONS", StringComparison.OrdinalIgnoreCase)) 
     { 
      HttpContext.Current.RemapHandler(new OptionsRequestHandler()); 
     } 
    } 

    private void onPostRequestHandlerExecute(object sender, EventArgs e) 
    { 
     string origin = HttpContext.Current.Request.Headers.Get("Origin"); 

     if (origin != null) 
     { 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", origin); 
      HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true"); 
     } 
    } 

    public void Dispose() 
    { 
    } 
} 

Что делает модуль для проверки глагола запроса и если запрос «OPTIONS», выбрал мой индивидуальный обработчик в вопросе, а не карту обработчика MVC.

Я делаю это, потому что я обнаружил, что существующие EnableCors для веб-API не подходят для моих приложений, и, используя этот настраиваемый процесс, у меня также больше контроля.

Смежные вопросы