Kesalahan ini sangat umum, dan saya mencoba semua solusi dan tidak ada yang berhasil. Saya telah menonaktifkan penerbitan WebDAV di panel kontrol dan menambahkan ini ke file konfigurasi web saya:
<handlers>
<remove name="WebDAV"/>
</handlers>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
Kesalahan masih berlanjut. Ini pengontrolnya:
static readonly IProductRepository repository = new ProductRepository();
public Product Put(Product p)
{
return repository.Add(p);
}
Implementasi metode:
public Product Add(Product item)
{
if (item == null)
{
throw new ArgumentNullException("item");
}
item.Id = _nextId++;
products.Add(item);
return item;
}
Dan di sinilah pengecualian dilemparkan:
client.BaseAddress = new Uri("http://localhost:5106/");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.PostAsJsonAsync("api/products", product);//405 exception
Ada saran?
c#
asp.net-web-api
webdav
Xardas
sumber
sumber
Saya memiliki pengecualian yang sama. Masalah saya adalah saya telah menggunakan:
using System.Web.Mvc; // Wrong namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; }
SEHARUSNYA
using System.Web.Http; // Correct namespace for HttpGet attribute !!!!!!!!! [HttpGet] public string Blah() { return "blah"; }
sumber
Saya mencoba banyak hal untuk mendapatkan kerja metode DELETE (saya mendapatkan metode 405 tidak diizinkan api web), dan akhirnya saya menambahkan [Route ("api / scan / {id}")] ke pengontrol saya dan berfungsi dengan baik. semoga posting ini membantu seseorang.
// DELETE api/Scan/5 [Route("api/scan/{id}")] [ResponseType(typeof(Scan))] public IHttpActionResult DeleteScan(int id) { Scan scan = db.Scans.Find(id); if (scan == null) { return NotFound(); } db.Scans.Remove(scan); db.SaveChanges(); return Ok(scan); }
sumber
Masalah saya ternyata adalah Perutean Atribut di WebAPI. Saya membuat rute khusus, dan itu memperlakukannya seperti GET daripada WebAPI menemukan itu adalah POST
[Route("")] [HttpPost] //I added this attribute explicitly, and it worked public void Post(ProductModel data) { ... }
Saya tahu itu pasti sesuatu yang konyol (yang menghabiskan seluruh hari Anda)
sumber
Chrome sering kali mencoba melakukan
OPTIONS
panggilan sebelum melakukan posting. Ini dilakukan untuk memastikan tajuk CORS teratur. Ini bisa menjadi masalah jika Anda tidak menanganiOPTIONS
panggilan di pengontrol API Anda.public void Options() { }
sumber
Galat ini juga dapat terjadi saat Anda mencoba menyambung ke http saat server menggunakan https.
Agak membingungkan karena get-request saya OK, masalahnya hanya ada pada post-request.
sumber
Saya mendapatkan 405 pada panggilan GET saya, dan masalahnya ternyata saya menamai parameter dalam metode sisi server GET
Get(int formId)
, dan saya perlu mengubah rute, atau mengganti namanyaGet(int id)
.sumber
Anda juga bisa mendapatkan kesalahan 405 jika mengatakan metode Anda mengharapkan parameter dan Anda tidak meneruskannya.
Ini TIDAK berhasil (kesalahan 405)
Tampilan HTML / Javascript
$.ajax({ url: '/api/News', //.....
Api Web:
public HttpResponseMessage GetNews(int id)
Dengan demikian jika metode signature seperti di atas maka yang harus Anda lakukan:
Tampilan HTML / Javascript
$.ajax({ url: '/api/News/5', //.....
sumber
Saya terlambat ke pesta ini tetapi karena tidak ada hal di atas yang layak atau berfungsi dalam banyak kasus, berikut adalah bagaimana hal ini akhirnya diselesaikan untuk saya.
Di server tempat situs / layanan dihosting, diperlukan fitur! AKTIVASI HTTP !!!
Ini kemudian bekerja secara instan! Itu melelehkan otak saya
sumber
Jika Anda memiliki rute seperti
[Route("nuclearreactors/{reactorId}")]
Anda perlu menggunakan nama parameter yang sama persis dalam metode misalnya
public ReactorModel GetReactor(reactorId) { ... }
Jika Anda tidak meneruskan parameter yang sama persis, Anda mungkin mendapatkan kesalahan "metode 405 tidak diizinkan" karena rute tidak akan cocok dengan permintaan dan WebApi akan menekan metode pengontrol berbeda dengan metode HTTP yang diizinkan berbeda.
sumber
Inilah salah satu solusinya
<handlers accessPolicy="Read, Script"> <remove name="WebDAV" /> </handlers>
artikel solusi docs.microsoft.com
dan hapus WebDAV dari modul
<remove name="WebDAVModule" />
sumber
Ini tidak menjawab pertanyaan spesifik Anda, tetapi ketika saya memiliki masalah yang sama, saya berakhir di sini dan saya pikir lebih banyak orang mungkin melakukan hal yang sama.
Masalah yang saya hadapi adalah bahwa saya tanpa sengaja menyatakan metode Dapatkan saya sebagai statis . Saya melewatkan ini sepanjang pagi hari, dan itu tidak menyebabkan peringatan dari atribut atau yang serupa.
Salah:
public class EchoController : ApiController { public static string Get() { return string.Empty; } }
Benar:
public class EchoController : ApiController { public string Get() { return string.Empty; } }
sumber
[HttpPost] tidak perlu!
[Route("")] public void Post(ProductModel data) { ... }
sumber
Saya TIDAK bisa menyelesaikan ini. Saya telah mengaktifkan CORS dan bekerja selama POST kembali kosong (ASP.NET 4.0 - WEBAPI 1). Ketika saya mencoba mengembalikan HttpResponseMessage, saya mulai mendapatkan respons HTTP 405.
Berdasarkan tanggapan Llad di atas, saya melihat referensi saya sendiri.
Saya memiliki atribut [System.Web.Mvc.HttpPost] yang tercantum di atas metode POST saya.
Saya mengubah ini untuk menggunakan:
[System.Web.Http.HttpPostAttribute] [HttpOptions] public HttpResponseMessage Post(object json) { ... return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; }
Ini memperbaiki kesedihan saya. Saya harap ini membantu orang lain.
Demi kelengkapan, saya memiliki yang berikut di web.config saya:
<httpProtocol> <customHeaders> <clear /> <add name="Access-Control-Expose-Headers " value="WWW-Authenticate"/> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, PATCH, DELETE" /> <add name="Access-Control-Allow-Headers" value="accept, authorization, Content-Type" /> <remove name="X-Powered-By" /> </customHeaders> </httpProtocol>
sumber
json
kemungkinannull
karena permintaan pra-penerbangan biasanya tidak memiliki muatan, atau Anda akan menjalankan tindakan pasca dua kali.Kami mengalami masalah serupa. Kami mencoba MENDAPATKAN dari:
[RoutePrefix("api/car")] public class CarController: ApiController{ [HTTPGet] [Route("")] public virtual async Task<ActionResult> GetAll(){ } }
Jadi kami akan
.GET("/api/car")
dan ini akan melempar405 error
.Perbaiki:
The
CarController.cs
berkas berada di direktori/api/car
jadi ketika kami meminta api endpoint ini, IIS akan mengirim kembali kesalahan karena itu tampak seperti kami berusaha untuk mengakses direktori virtual yang kami tidak diperbolehkan untuk.Opsi 1: Ubah / ganti nama direktori pengontrol berada di
Opsi 2: ubah awalan rute ke sesuatu yang tidak cocok dengan direktori virtual.
sumber
Dalam kasus saya, saya memiliki folder fisik dalam proyek dengan nama yang sama dengan rute WebAPI (misalnya sandbox) dan hanya permintaan POST yang dicegat oleh penangan file statis di IIS (jelas).
Mendapatkan kesalahan 405 yang menyesatkan, bukan 404 yang lebih diharapkan, adalah alasan saya butuh waktu lama untuk memecahkan masalah.
Tidak mudah untuk jatuh ke dalam ini, tapi mungkin. Semoga bisa membantu seseorang.
sumber
Bagi saya, penangan POST saya adalah dari bentuk ini:
[HttpPost("{routeParam}")] public async Task<ActionResult> PostActuality ([FromRoute] int routeParam, [FromBody] PostData data)
Saya menemukan bahwa saya harus menukar argumen , yaitu data tubuh terlebih dahulu kemudian parameter rute, seperti ini:
[HttpPost("{routeParam}")] public async Task<ActionResult> PostActuality ([FromBody] PostData data, [FromRoute] int routeParam)
sumber
periksa file .csproj proyek Anda dan ubah
<IISUrl>http://localhost:PORT/</IISUrl>
ke url situs web Anda seperti ini
<IISUrl>http://example.com:applicationName/</IISUrl>
sumber
Masalah lain yang mungkin menyebabkan perilaku yang sama adalah parameter default dalam perutean. Dalam kasus saya, pengontrol ditempatkan dan dibuat dengan benar, tetapi POST diblokir karena
Get
tindakan default ditentukan:config.Routes.MapHttpRoute( name: "GetAllRoute", routeTemplate: "api/{controller}.{ext}"/*, defaults: new { action = "Get" }*/ // this was causing the issue );
sumber
Saya mengalami masalah yang persis sama. Saya mencari selama dua jam apa yang salah tanpa hasil sampai saya menyadari
POST
metode saya adalahprivate
gantinyapublic
.Lucu sekarang melihat pesan kesalahan itu agak umum. Semoga membantu!
sumber
Pastikan pengontrol Anda mewarisi dari
Controller
kelas.Bahkan mungkin lebih gila lagi bahwa barang-barang akan bekerja secara lokal bahkan tanpa itu.
sumber