Nancy: A rota OPTIONS ignora os pipelines Antes / Depois

Criado em 28 jan. 2014  ·  7Comentários  ·  Fonte: NancyFx/Nancy

Eu uso Nancy junto com o backbone. Quando eu salvo um modelo no servidor, o backbone envia uma solicitação OPTIONS para verificar se o servidor aceita solicitações PUT (veja esta resposta do SO ). Nancy responde isso automaticamente, mas não executa o pipeline posterior do meu módulo, que se parece com isto:

After += ctx => ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");

Como Access-Control-Allow-Origin não está definido, a solicitação falha:

OPTIONS http://localhost:5555/machines No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. vendor.js:3
XMLHttpRequest cannot load http://localhost:5555/machines. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access. 

Solicite cabeçalhos:

Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en,de-DE;q=0.8,de;q=0.6,en-US;q=0.4,fr;q=0.2
Access-Control-Request-Headers:accept, content-type
Access-Control-Request-Method:PUT
Cache-Control:no-cache
Connection:keep-alive
Host:localhost:5555
Origin:http://localhost
Pragma:no-cache
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36

Cabeçalhos de resposta:

Allow:GET, POST, PUT
Cache-Control:private
Connection:Close
Content-Length:0
Date:Tue, 28 Jan 2014 08:20:13 GMT
Server:ASP.NET Development Server/11.0.0.0
X-AspNet-Version:4.0.30319

Comentários muito úteis

Estou tendo o mesmo problema e o ApplicationStartup não me ajudou

Todos 7 comentários

Como a solicitação OPTIONS é tratada fora de um módulo, o DefaultRouteResolver retorna um ResolveResult onde Before e After pipelines são null , aqui .

Isso resulta no retorno de DefaultRequestDispatcher cedo e não invoca nenhum pipeline aqui .

A solução seria colocar os pipelines em DefaultRouteResolver , talvez adicionando um método Initialize como IDiagnostics , IApplicationStartup , etc. e invocá-lo em o bootstrapper em algum lugar: smile:

Eu só vim até aqui:

protected override NancyInternalConfiguration InternalConfiguration
{
    get
    {
        return NancyInternalConfiguration.WithOverrides(x => x.RouteResolver = typeof(CustomRouteResolver));
    }
}

public class CustomRouteResolver : DefaultRouteResolver 
{
  public CustomRouteResolver(INancyModuleCatalog catalog, INancyModuleBuilder moduleBuilder, IRouteCache routeCache, IRouteResolverTrie trie)
        : base(catalog, moduleBuilder, routeCache, trie)
    {

    }
    public void Initialize()
    {
    }
}

O Resolve não executa nenhum callback antes de passar a solicitação para BuildOptionsResult , e é por isso que não tenho ideia do que fazer em Initialize . Mas eu não conheço Nancy muito bem ...

Você pode ajudar? Muito obrigado!

Vou dar uma olhada nisso: wink:

Então, isso está dentro de um NancyModule ? Existe uma razão para isso estar dentro de um módulo específico? Escrevi um teste que passa perfeitamente:

[Fact]
public void Should_invoke_AfterRequest_pipeline()
{
    var afterPipelineInvoked = false;
    var bootstrapper = new ConfigurableBootstrapper();

    bootstrapper.AfterRequest
            .AddItemToEndOfPipeline(ctx => afterPipelineInvoked = true);

    new Browser(bootstrapper).Options("/");

    Assert.True(afterPipelineInvoked);
}

Tente adicionar o Access-Control-Allow-Origin cabeçalho do bootstrapper ApplicationStartup método em vez disso: sorriso:

Você está totalmente certo, funciona quando eu faço o bootstrapper:

protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
    pipelines.AfterRequest += (ctx) =>
    {
        ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
    }
}

Obrigado novamente! :afirmativo:

Fico feliz que você tenha entendido! : dançarinos:

Estou tendo o mesmo problema e o ApplicationStartup não me ajudou

Esta página foi útil?
0 / 5 - 0 avaliações