web-dev-qa-db-fra.com

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

J'ai créé une API Web 2 et j'essaie de lui faire une demande interdomaine mais j'obtiens l'erreur suivante:

OPTIONS http://www.example.com/api/save 405 (méthode non autorisée)

J'ai jeté un coup d'œil et la plupart des résolutions de ce problème disent que je dois installer les COR de NuGet et l'activer, j'ai donc installé le package et marqué mon contrôleur avec

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

Mais cela n'a toujours pas résolu le problème.

Mon ApiController n'a que la méthode Save suivante dans:

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

Voici mes js 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);
    }
});

Y a-t-il autre chose que je dois faire pour activer cela?

23
user1987162

En fin de compte, j'ai résolu ce problème en modifiant la demande ajax. J'ai découvert que le contrôle en amont OPTIONS n'est envoyé que dans certaines situations, notamment si la demande contient un Content-Type qui ne fait pas partie des types suivants:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • texte simple

Donc, en supprimant le type de contenu dans ma demande ajax et en le modifiant comme suit:

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

J'ai pu le faire fonctionner.

Cette page contient des informations utiles sur les demandes simples et comment éviter les demandes de contrôle en amont

1
user1987162

Via nuget, faites l'installation du package d'API web CORS pour votre projet:

Install-Package Microsoft.AspNet.WebApi.Cors

Dans WebApiConfig, ajoutez les lignes suivantes:

var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);
23
Flavio Franco Jr.

Celui-ci a résolu mon problème

Étape 1

Installez le package Cors Microsoft.AspNet.WebApi.Cors (Solution de clic droit> Gérer le package Nuget> puis recherchez Cors)

Étape 2

mettre cette ligne dans le fichier WebApiConfig.cs

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

Remplacez http: // localhost: 30 par l'adresse de l'appelant API

3
user2546477

Assurez-vous que OPTIONS est 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"/>
3
Code Uniquely

Essayez également d'utiliser l'option de demande ajcr withcredentials

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