2014-10-30 15 views
15

Tôi đã tạo ra một trang web api 2 và tôi đang cố gắng để làm một yêu cầu tên miền chéo nó nhưng tôi nhận được lỗi sau:OPTIONS 405 (Phương pháp không được phép) web api 2

OPTIONS http://www.example.com/api/save 405 (Method Not Allowed)

tôi đã có một cái nhìn xung quanh và hầu hết các giải pháp cho vấn đề này đang nói rằng tôi cần phải cài đặt CORS từ NuGet và kích hoạt nó vì vậy tôi đã cài đặt các gói và đánh dấu điều khiển của tôi với

[EnableCors("*", "*", "*")] 

Nhưng điều này vẫn chưa giải quyết được vấn đề.

My ApiController chỉ có Save phương pháp sau đây trong:

[ResponseType(typeof(int))] 
public IHttpActionResult Save(Student student) 
{ 
    if (ModelState.IsValid) 
    { 
     using (StudentHelper helper = new StudentHelper()) 
     { 
      return Ok(helper.SaveStudent(student)); 
     } 
    } 
    else 
    { 
     return BadRequest(ModelState); 
    } 
} 

Đây là js của tôi từ một tên miền khác nhau:

$.ajax({ 
    type: "POST", 
    crossDomain: true, 
    data: JSON.stringify(student), 
    crossDomain: true, 
    url: 'http://www.example.com/api/save', 
    contentType: "application/json", 
    success: function (result) { 
     console.log(result); 
    } 
}); 

Có cái gì khác tôi cần phải làm để cho phép điều này?

Trả lời

1

Cuối cùng tôi đã giải quyết điều này bằng cách thay đổi các yêu cầu ajax. Tôi phát hiện ra rằng các preflight OPTIONS chỉ gửi trong các tình huống nhất định - một trong số đó là nếu yêu cầu có chứa một Content-Type đó không phải là một trong các loại sau đây:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • text/plain

Vì vậy, bằng cách loại bỏ các content-type trong yêu cầu ajax của tôi và thay đổi nó như sau:

$.ajax({ 
    type: "POST", 
    crossDomain: true, 
    data: student, 
    dataType: 'json', 
    url: 'http://www.example.com/api/save', 
    success: function (result) { 
     console.log(result); 
    } 
}); 

Tôi có thể làm cho nó hoạt động.

This page has useful information about simple requests and how to avoid preflight requests

+3

Điều này không giải quyết được vấn đề, nó tránh được nó. Đối với những người cần thực sự hỗ trợ các yêu cầu OPTIONS preflight, điều này không hữu ích. – defines

+1

@ xác định điều này giải quyết vấn đề của tôi vì vậy không cần phải downvote - vấn đề của tôi là tôi cần một yêu cầu đơn giản vì tôi không cần phải hỗ trợ preflight. Nếu ai đó đang tìm cách hỗ trợ preflight, câu hỏi này không phải là về điều đó, đó là cách tôi có thể gọi ajax để nói chuyện với api web của mình - và câu trả lời là đưa ra một yêu cầu đơn giản, không cho phép hỗ trợ preflight –

+1

Tiêu đề của câu hỏi là về OPTIONS quay lại 405. Bạn tránh hoàn toàn yêu cầu OPTIONS. Đây không phải là câu trả lời cho điều đó chút nào, nó đơn giản tránh nó. – defines

1

Đảm bảo rằng bạn có TÙY CHỌN là một trong những động từ được phép trong web.config của bạn và nó được xử lý bởi trình xử lý mặc định.

<system.web> 
... 
    <httpHandlers> 
    ... 
    <add path="*" verb="OPTIONS" type="System.Web.DefaultHttpHandler" validate="true"/> 
    <add path="*" verb="TRACE" type="System.Web.DefaultHttpHandler" validate="true"/> 
    <add path="*" verb="HEAD" type="System.Web.DefaultHttpHandler" validate="true"/> 
0

Ngoài ra hãy thử sử dụng theo yêu cầu tùy chọn withcredentials ajax

$.ajax({ 
    type: "POST", 
    crossDomain: true, 
    data: JSON.stringify(student), 
    withCredentials: true, 
    url: 'http://www.example.com/api/save', 
    contentType: "application/json", 
    success: function (result) { 
     console.log(result); 
    } 
    }); 
+0

Hi Tôi cố gắng này, nhưng nó không hoạt động –

+0

Ok! tệp cấu hình webapi của bạn trông như thế này? public static class WebApiConfig { public static void Register (cấu hình HttpConfiguration) { // Mã mới config.EnableCors(); config.Routes.MapHttpRoute ( tên: "DefaultApi", routeTemplate: "api/{controller}/{id}", mặc định: new {id = RouteParameter.Optional} ); } } – Bilal

+0

Điểm quan tâm là config.EnableCors(); – Bilal

18

Via NuGet làm cho việc cài đặt các gói API web CORS cho dự án của bạn:

Install-Package Microsoft.AspNet.WebApi.Cors

Trong WebApiConfig thêm những dòng sau đây:

var cors = new EnableCorsAttribute ("*", "*", "*"); 
config.EnableCors (cors); 
+1

Tôi phải xóa dấu sao cho thông số gốc và đặt url: 'new EnableCorsAttribute (" https: // myservicesite "," * "," * ");' Với tham số dấu sao, yêu cầu OPTIONS luôn gửi lỗi 405 ... – NicoD

+0

OP nói rằng họ đã thử điều này và nó không hoạt động. –

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