2014-10-03 13 views
7

Tôi đang cố gắng để có được tất cả các loại yêu cầu để làm việc với Nancy và CORS. Hiện nay tôi thêm một đường ống dẫn ở phần cuối của các yêu cầu:Bắt CORS để làm việc với Nancy

  pipelines.AfterRequest.AddItemToEndOfPipeline((ctx) => ctx.Response 
      .WithHeader("Access-Control-Allow-Origin", "http://localhost:57515") 
      .WithHeader("Access-Control-Allow-Methods", "POST, GET, DELETE, PUT, OPTIONS") 
      .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type") 
      .WithHeader("Allow", "POST, GET, DELETE, PUT, OPTIONS")) 

Yêu cầu lựa chọn quay trở lại với một mã trạng thái 200, dẫn tôi để tin rằng nó thực hiện tốt, nhưng đối với bất kỳ loại yêu cầu khác hơn OPTIONS nó không thành công với 405 phương pháp không được phép. Có điều gì khác mà tôi cần phải làm ở phía khách hàng hoặc phía máy chủ để có được điều này để làm việc?

Thư viện phía máy khách mà tôi đang sử dụng là xương sống.

Xin cảm ơn trước.

Trả lời

14

Tôi không nghĩ bạn cần chỉ định OPTIONS như một phương thức CORS được cho phép. Tôi chưa bao giờ thấy bộ đó, và tôi chưa bao giờ tự đặt nó. Trình duyệt không phàn nàn.

Otherside Tôi có một thiết lập tương tự như bạn trong tôi:

public abstract class MyModule : NancyModule 
    protected MyModule(bool hasRazorView = true) 
     After.AddItemToEndOfPipeline((ctx) => ctx.Response 
      .WithHeader("Access-Control-Allow-Origin", "*") 
      .WithHeader("Access-Control-Allow-Methods", "POST,GET") 
      .WithHeader("Access-Control-Allow-Headers", "Accept, Origin, Content-type")); 
     . . . . 
    } 
} 

Trong trường hợp của tôi, CORS được gửi về GET và POST của tôi, nhưng không phải là OPTIONS. Tôi đã bỏ qua xử lý OPTIONS mặc định với Options["/"] = route => new Response(). Điều đó cho phép phần còn lại của đường ống lửa.

+1

điều này sẽ là câu trả lời. Điều này đã giúp tôi cảm ơn bạn rất nhiều. – tronious

1

tôi thấy nó đẹp hơn để xử lý tiêu đề CORS trong IIS Ổ ghi quy tắc này là mẫu phần viết lại webconfig mà không rằng:

<rewrite> 
    <outboundRules> 
    <rule name="Set Access Control Allow Origin Header" preCondition="Origin header"> 
     <match serverVariable="RESPONSE_Access-Control-Allow-Origin" pattern="(.*)" /> 
     <action type="Rewrite" value="{HTTP_ORIGIN}" /> 
    </rule> 
    <rule name="Set Access Control Allow Headers Header" preCondition="Origin header"> 
     <match serverVariable="RESPONSE_Access-Control-Allow-Headers" pattern="(.*)" /> 
     <action type="Rewrite" value="Content-Type" /> 
    </rule> 
    <rule name="Set Access Control Allow Methods Header" preCondition="Origin header"> 
     <match serverVariable="RESPONSE_Access-Control-Allow-Method" pattern="(.*)" /> 
     <action type="Rewrite" value="POST,GET,OPTIONS" /> 
    </rule> 
    <rule name="Set Access Control Allow Credentials Header" preCondition="Origin header"> 
     <match serverVariable="RESPONSE_Access-Control-Allow-Credentials" pattern="(.*)" /> 
     <action type="Rewrite" value="true" /> 
    </rule> 
    <preConditions> 
     <preCondition name="Origin header" logicalGrouping="MatchAny"> 
     <add input="{HTTP_ORIGIN}" pattern="(http://localhost$)" /> 
     <add input="{HTTP_ORIGIN}" pattern="(http://.*\.YOURDOMAIN\.com$)" /> 
     </preCondition> 
    </preConditions> 
    </outboundRules> 
</rewrite> 

Hãy nhớ để cài đặt mô-đun IIS viết lại: http://www.iis.net/downloads/microsoft/url-rewrite

+2

Tôi không nghĩ rằng đây thực sự là câu trả lời vì nó phụ thuộc vào nền tảng lưu trữ, nếu bạn đang sử dụng NancyFX và OWIN bạn có thể lưu trữ trên nhiều nền tảng khác nhau. Câu hỏi này dường như không đề cập đến IIS. :( – peteski

0

On NET Core, tôi đã có thể đi qua CORS bằng cách sử dụng mã dưới đây vào phương pháp Configure:

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. 
    public virtual void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
     loggerFactory.AddDebug(); 

     // Shows UseCors with CorsPolicyBuilder. 
     app.UseCors(builder => 
      builder.WithOrigins(new[] { "http://localhost:4200" }).AllowAnyHeader() 
        .AllowAnyMethod() 
        .AllowCredentials() 
      ); 

     app.UseOwin(a => a.UseNancy(b => b.Bootstrapper = new NancyBootstrap(this.Container))); 

    } 
Các vấn đề liên quan