OPTIONS 405 (Méthode non autorisée) api web 2

j'ai créé une api web 2 et j'essaie de faire une requête de domaine croisée mais j'obtiens l'erreur suivante:

OPTIONS http://www.example.com/api/save 405 (Méthode Non Autorisée)

j'ai fait un tour d'horizon et la plupart des résolutions pour ce problème disent que je dois installer CORs à partir de NuGet et l'activer donc j'ai installé le paquet et marqué mon contrôleur avec

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

mais cela n'est pas encore résolu le problème.

Mon ApiController uniquement a la suite Save méthode:

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

C'est mon js à partir d'un domaine différent:

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

Est-il autre chose que je dois faire pour l'activer?

17
demandé sur Flavio Franco Jr. 2014-10-30 12:32:31

5 réponses

Via nuget faire l'installation du paquet D'API Web CORS pour votre projet:

Install-Package Microsoft.AspNet.WebApi.La scro

dans WebApiConfig ajouter les lignes suivantes:

var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);
20
répondu Flavio Franco Jr. 2015-07-20 14:50:33

assurez-vous que vous avez des OPTIONS comme l'un des verbes autorisés dans votre web.config et qu'il est géré par le gestionnaire par défaut.

<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"/>
1
répondu Code Uniquely 2014-10-30 10:54:37

essayez aussi d'utiliser l'option withcredentials ajax request

    $.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
répondu Bilal 2014-10-30 11:13:25

celui-ci a résolu mon problème

Etape 1

installer le paquet Cors Microsoft.AspNet.WebApi.La scro (Clic Droit sur la Solution > Gestion de Package Nuget > Et Ensuite, la Recherche de la Scro)

Etape 2

mettre cette ligne dans le WebApiConfig.cs le fichier

public static void Register(HttpConfiguration config)
{
    config.EnableCors(new EnableCorsAttribute("http://localhost:3000", headers: "*", methods: "*"));        
    .
    .
    .        
} 

Modifier http://localhost:3000 pour l'adresse de l'API de l'Appelant

0
répondu user2546477 2018-08-13 15:44:32

à la fin j'ai résolu cela en changeant la requête ajax. J'ai trouvé que l' OPTIONS le pré-vol n'est envoyé que dans certaines situations - l'une d'elles étant si la demande contient un Content-Type ce n'est pas l'un des types suivants:

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

donc en supprimant le type de contenu dans ma requête ajax et en le changeant en suivantes:

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

j'ai été en mesure de le faire fonctionner.

cette page contient des informations utiles sur les requêtes simples et comment éviter les requêtes avant vol

-2
répondu iwayneo 2015-09-08 09:02:32