c# - verb - OPCIONES 405(Método no permitido) web api 2
put 405(method not allowed) (5)
A través de nuget, realice la instalación del paquete de API web de CORS para su proyecto:
Paquete de instalación Microsoft.AspNet.WebApi.Cors
En WebApiConfig agrega las siguientes líneas:
var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);
He creado una API web 2 y estoy intentando hacerle una solicitud de dominio cruzado, pero aparece el siguiente error:
OPCIONES http://www.example.com/api/save 405 (Método no permitido)
He echado un vistazo y la mayoría de las soluciones para este problema dicen que necesito instalar CORs de NuGet y habilitarlo, así que instalé el paquete y marqué mi controlador con
[EnableCors("*", "*", "*")]
Pero esto todavía no ha resuelto el problema.
Mi ApiController
solo tiene el siguiente método de Save
en:
[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);
}
}
Este es mi js de un dominio diferente:
$.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);
}
});
¿Hay algo más que deba hacer para habilitar esto?
Al final he resuelto esto cambiando la solicitud de ajax. Descubrí que la verificación previa de OPTIONS
solo se envía en ciertas situaciones, una de ellas es si la solicitud contiene un tipo de Content-Type
que no es uno de los siguientes tipos:
- aplicación / x-www-form-urlencoded
- multipart / form-data
- Texto sin formato
Entonces, eliminando el tipo de contenido en mi solicitud de ajax y cambiándolo a lo siguiente:
$.ajax({
type: "POST",
crossDomain: true,
data: student,
dataType: ''json'',
url: ''http://www.example.com/api/save'',
success: function (result) {
console.log(result);
}
});
Pude hacerlo funcionar.
Asegúrese de tener OPCIONES como uno de los verbos permitidos en su web.config y de que el controlador predeterminado lo maneja.
<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"/>
Esta solucionó mi problema
Paso 1
Instale el paquete Cors Microsoft.AspNet.WebApi.Cors (Haga clic con el botón derecho en Solución> Gestionar paquete Nuget> y luego busque Cors)
Paso 2
ponga esta línea en el archivo WebApiConfig.cs
public static void Register(HttpConfiguration config)
{
config.EnableCors(new EnableCorsAttribute("http://localhost:3000", headers: "*", methods: "*"));
.
.
.
}
Cambie http: // localhost: 3000 a la dirección del API Caller
También intente utilizar la opción de solicitud ajax 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);
}
});