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
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
Comentários muito úteis
Estou tendo o mesmo problema e o ApplicationStartup não me ajudou