Saya menggunakan Nancy bersama dengan tulang punggung. Ketika saya menyimpan model ke server, backbone mengirimkan permintaan OPSI untuk memeriksa apakah server menerima permintaan PUT (lihat jawaban SO ini ). Nancy menjawab ini secara otomatis, tetapi tidak menjalankan pipa setelah modul saya, yang terlihat seperti ini:
After += ctx => ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
Karena Access-Control-Allow-Origin
tidak disetel, permintaan gagal:
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.
Header permintaan:
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
Header respons:
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
Karena permintaan OPTIONS
ditangani di luar modul, DefaultRouteResolver
mengembalikan ResolveResult
mana pipa Before
dan After
adalah null
, di sini .
Ini menghasilkan DefaultRequestDispatcher
kembali lebih awal dan tidak menggunakan saluran pipa apa pun, di sini .
Solusinya adalah entah bagaimana memasukkan saluran pipa ke DefaultRouteResolver
, mungkin dengan menambahkan metode Initialize
seperti IDiagnostics
, IApplicationStartup
, dll. bootstrap di suatu tempat :senyum:
Saya hanya datang sejauh ini:
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()
{
}
}
Resolve tidak menjalankan panggilan balik apa pun sebelum meneruskan permintaan ke BuildOptionsResult
, itulah sebabnya saya tidak tahu apa yang harus dilakukan di Initialize
. Tapi aku tidak begitu mengenal Nancy...
Bisakah kamu menolong? Terima kasih banyak!
nanti saya lihat :wink:
Jadi ini dalam NancyModule
? Apakah ada alasan mengapa ini harus berada di dalam modul tertentu? Saya menulis tes yang lulus dengan sempurna:
[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);
}
Coba tambahkan header Access-Control-Allow-Origin
di metode ApplicationStartup
bootstrap sebagai gantinya :smile:
Anda benar sekali, ini berfungsi ketika saya melakukan ini bootstrap:
protected override void ApplicationStartup(TinyIoCContainer container, IPipelines pipelines)
{
pipelines.AfterRequest += (ctx) =>
{
ctx.Response.Headers.Add("Access-Control-Allow-Origin", "*");
}
}
Terima kasih lagi! :jempolan:
Senang Anda mengetahuinya! :penari:
Saya mengalami masalah yang sama dan ApplicationStartup tidak membantu saya
Komentar yang paling membantu
Saya mengalami masalah yang sama dan ApplicationStartup tidak membantu saya