2014-10-30 24 views
15

Bir web API 2 oluşturduk ve ben buna bir web alanları arası isteği yapmaya çalışıyorum ama aşağıdaki hatayı alıyorum:SEÇENEKLER 405 (Yönteme İzin Verilmiyor) web api 2

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

ben etrafına bir göz vardı ve bu sorun için en çözünürlükleri ben Nuget gelen CORS yüklemek ve etkinleştirmeniz gerekir söylüyoruz yüzden paketi yüklenmiş ve

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

ile benim denetleyici işaretlenmiş Ama bu hala çözülmüş değil var sorun.

Benim ApiController sadece sahiptir aşağıdaki Save yöntemi:

[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); 
    } 
} 

Bu farklı bir etki alanından benim js geçerli:

$.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); 
    } 
}); 

Bunu etkinleştirmek için yapmanız gereken başka bir şey var mı?

cevap

1

kullanmayı deneyin.

  • application/
  • x-www-form-urlencoded: istek aşağıdaki türlerden biri değildir bir Content-Type içeriyorsa bunlardan biri olmak - Ben OPTIONS uçuş öncesi yalnızca belirli durumlarda gönderilir öğrendim
  • çok parçalı/benim ajax isteği içinde içerik türü kaldırılması ve aşağıdaki şekilde değiştirerek Yani

  • metin/düz form-data:

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

    Çalışmayı başarabildim. WebApiConfig yılında

    Install-Package Microsoft.AspNet.WebApi.Cors

    aşağıdaki satırları ekleyin:

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

  • +3

    içinde etkin korsanlar var Bu sorunu çözmez, önler. Preflight OPTIONS isteklerini gerçekten desteklemeleri gerekenler için, bu yararlı değildir. – defines

    +1

    @defines bu benim problemimi çözüyor, bu yüzden downvote etmeye gerek yok - benim problemim, preflightı desteklemem gerekmediği için basit bir talebe ihtiyacım vardı. Birisi ön fareyi nasıl destekleyeceğini arıyorsa, bu soru bununla ilgili değil, ajax çağrısı ağ api'mle nasıl konuştuğumla ilgili olabilir - ve cevap basit bir istekte bulunmaktı. preflight –

    +1

    Sorunun başlığı 405 döndüren OPTIONS hakkında. OPTIONS isteğinden tamamen kaçınmalısınız. Bu bir cevap değil, sadece bunu önler. – defines

    1

    Web.config dosyasında izin verilen fiillerden biri olarak OPTIONS kullandığınızdan ve varsayılan işleyici tarafından ele alındığından emin olun.

    <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

    Ayrıca ben ajax isteği değiştirerek bu çözmüş Sonunda withcredentials ajax isteği seçeneğini

    $.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

    Merhaba ben bu onu ama çalıştı çalışmadı –

    +0

    Tamam! webapi yapılandırma dosyanız böyle görünüyor mu? genel statik sınıf WebApiConfig { Genel statik geçersiz Kayıt (HttpConfiguration config) { // Yeni kod config.EnableCors(); config.Routes.MapHttpRoute ( ad: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new {id = RouteParameter.Optional} ); } } – Bilal

    +0

    Yapılandırılmakta olan ilgi noktası.EnableCors(); – Bilal

    18

    Via projeniz için CORS web API paketi kurulumunu yapmak Nuget

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

    Kökeni parametresinin yıldızını kaldırmalı ve bir url: 'new EnableCorsAttribute (" https: // myservicesite "," * "," * "); yıldız parametresiyle OPTIONS isteği her zaman bir 405 hatası gönderdim. ... – NicoD

    +0

    OP, bunu zaten denediklerini ve işe yaramadığını belirtti. –

    İlgili konular