ASP.NET Web Api: İstenen kaynak "GET" http yöntemini desteklemiyor


95

Bir ApiController üzerinde şu eylemi gerçekleştirdim:

public string Something()
{
    return "value";
}

Ve rotalarımı şu şekilde yapılandırdım:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

Beta sürümde bu gayet iyi çalıştı, ancak en son Sürüm Adayına güncelledim ve şimdi şu tür çağrılarda hatalar görüyorum:

İstenen kaynak http yöntemini 'GET' desteklemiyor.

Bu neden artık çalışmıyor?

(Sanırım {action} 'dan kurtulabilirim ve bir sürü kontrolcü yapabilirim, ama bu biraz dağınık.)

Yanıtlar:


110

Denetleyicideki eyleminizde herhangi bir HttpMethod yapılandırmadıysanız, bunun RC'de yalnızca HttpPost olduğu varsayılır. Beta'da tüm yöntemleri - GET, PUT, POST ve Silme - desteklediği varsayılmaktadır. Bu, betadan RC'ye küçük bir değişikliktir. [AcceptVerbs ("GET", "POST")] ile eyleminize ilişkin birden fazla http yöntemini kolayca detaylandırabilirsiniz.


bununla az önce karşılaştım, düzeltme için teşekkürler, ama merak ediyorum, neden bunu özel yöntemlerimle yapmak zorundayım ama varsayılan "Get" yöntemiyle değil? Denetleyici için şablon tarafından oluşturulan bir Get yöntemim var, ancak dekore edilmemiş. Bu sadece Get adı yüzünden bir konvansiyonel mi?
SelAromDotNet

3
@ Josh: Evet! Eylem yönteminin adı "Get ..." ile başladığında, onu bir GET yöntemi olarak işaretlemeniz gerekmez. Daha fazlasını buradan okuyun: asp.net/web-api/overview/web-api-routing-and-actions/…
Krisztián Balla

Cevapta önerildiği gibi yaptım, ancak şimdi her iki çağrım, Al ve Gönder, Eylem Al'a yönlendiriliyor. Herhangi bir yardım lütfen?
Syed Ali Taqi

55

Yukarıdaki bilgilerin tümü doğrudur, ayrıca [AcceptVerbs()]ek açıklamanın hem System.Web.Mvc hem de System.Web.Http ad alanlarında bulunduğunu belirtmek isterim .

System.Web.Http bir Web API denetleyicisiyse kullanmak istiyorsunuz.


@Eric. Harika, benim için çalışmamasının nedeni buydu. Eylemimde fiil vardı ama Web.Mvc aracılığıyla referans verildi, bu yüzden çalışmıyordu.
dreza

Harika,
Günümü

Çok teşekkür ederim, çünkü System.Web.Mvc benim için iyi değildi.
Burak Karakuş

34

Bu OP'ye bir yanıt olmasa da, tamamen farklı bir temel nedenden dolayı aynı hatayı aldım; yani bu başka birine yardımcı olursa ...

Benim için sorun, WebAPI'nin isteği beklenmedik şekilde yönlendirmesine neden olan yanlış adlandırılmış bir yöntem parametresiydi. ProgrammesController'ımda aşağıdaki yöntemlere sahibim:

[HttpGet]
public Programme GetProgrammeById(int id)
{
    ...
}

[HttpDelete]
public bool DeleteProgramme(int programmeId)
{
    ...
}

DELETE istekleri ... / api / programs / 3'e beklediğim gibi DeleteProgramme'a değil GetProgrammeById'e yönlendiriliyordu, çünkü DeleteProgramme'ın bir parametre adı kimliği yoktu. GetProgrammeById, sadece GET'leri kabul ediyor olarak işaretlendiğinden, tabii ki DELETE'i reddediyordu.

Yani düzeltme basitti:

[HttpDelete]
public bool DeleteProgramme(int id)
{
    ...
}

Ve her şey yolunda. Aptalca bir hata gerçekten ama ayıklanması zor.


1
Herkes yönlendirme url kullanıyorsa, gibi yapıyor deneyin [Rota ( "{programmeId = programmeId: int}")]
sreen

1
Bu benim içindi. WebApiConfig -> MapHttpRoutes vardı -> routeTemplate: "api / {controller} / {id}", bu nedenle 'id' parametresi kullanılmalıydı.
HockeyJ

1
Cevabınız beni biraz farklı olan sorunuma işaret etti Metod için bir [FromUri] parametresinin adını değiştirdim ve istemci tarafında güncellemedim
Matus

22

Yönteminizi ile dekore ediyorsanız , kontrol cihazının üstüne HttpGetaşağıdakileri ekleyin using:

using System.Web.Http;

Kullanıyorsanız System.Web.Mvc, bu sorun ortaya çıkabilir.


5
Bu doğru ve gülünç bir şekilde .NET mesajı net olarak göstermiyor.
Teoman shipahi

15

Bu kesinlikle Beta'dan RC'ye bir değişikliktir. Soruda verilen örnekte, eyleminizi şimdi [HttpGet] veya [AcceptVerbs ("GET")] ile dekore etmeniz gerekiyor.

Fiil tabanlı eylemleri (yani "GetSomething", "PostSomething") fiil tabanlı olmayan eylemlerle karıştırmak istiyorsanız bu bir soruna neden olur. Yukarıdaki öznitelikleri kullanmaya çalışırsanız, denetleyicinizdeki herhangi bir fiil tabanlı eylemle çatışmaya neden olur. Her fiil için ayrı yollar tanımlamanın ve varsayılan eylemi fiilin adına ayarlamanın bir yolu saymaktır. Bu yaklaşım, API'nizdeki alt kaynakları tanımlamak için kullanılabilir. Örneğin, aşağıdaki kod şunları destekler: "/ resource / id / children" burada id ve alt öğeler isteğe bağlıdır.

        context.Routes.MapHttpRoute(
           name: "Api_Get",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Get" },
           constraints: new { httpMethod = new HttpMethodConstraint("GET") }
        );

        context.Routes.MapHttpRoute(
           name: "Api_Post",
           routeTemplate: "{controller}/{id}/{action}",
           defaults: new { id = RouteParameter.Optional, action = "Post" },
           constraints: new { httpMethod = new HttpMethodConstraint("POST") }
        );

Umarım Web API'nin gelecekteki sürümleri bu senaryo için daha iyi desteğe sahip olacaktır. Şu anda http://aspnetwebstack.codeplex.com/workitem/184 adındaki aspnetwebstack codeplex projesinde kaydedilen bir sorun var . Bu görmek istediğiniz bir şeyse, lütfen konuya oy verin.


8

OP ile aynı Kuruluma sahip. Birçok eylemi olan tek bir denetleyici ... daha az "dağınık" :-)

Benim durumumda, yeni bir eylem eklerken "[HttpGet]" i unuttum.

[HttpGet]
public IEnumerable<string> TestApiCall()
{
    return new string[] { "aa", "bb" };
}

6

Yukarıdakiyle aynı sorun, ancak kökten çok farklı. Benim için, https yeniden yazma kuralıyla bir uç noktaya ulaşıyordum. Http'da vurmak hataya neden oldu, https ile beklendiği gibi çalıştı.


3

Bu yolda aşağıdaki kodu değiştirin

Yol:

App_Start => WebApiConfig.cs

Kod:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}/{Param}",
            defaults: new { id = RouteParameter.Optional,
                            Param = RouteParameter.Optional }
                          );

1

Bunun OP'nin gönderisiyle ilgili olup olmadığını bilmiyorum ama [HttpGet] açıklamasını kaçırıyordum ve @dinesh_ravva yöntemlerinde belirtildiği gibi, varsayılan olarak HttpPost olduğu varsayıldığından hataya neden olan buydu.


0

Sorunum, döndürülen mesajda görünmeyen boş bir referansa sahip olmak kadar basitti, görmek için API'mde hata ayıklamak zorunda kaldım.


0

SSL olmadan bir sorgu çalıştırırken bu hatayı aldım.

İsteğimin URL şemasını HTTP'den HTTPS'ye değiştirmek sorunu çözdü.


@cizario Katılmıyorum - soruyu cevaplama girişimi gibi görünüyor. Bunda "İyi Görünüyor" oyu veriyorum.
EJoshuaS - Monica'yı yeniden etkinleştir

@ EJoshuaS-ReinstateMonica daha çok soruya gerçek bir cevap değil, bir yorum gibi görünüyor. Kabul edilen cevaba ve altındaki diğer cevaplara göre sorunun şema ile ilgili olmadığı görülmektedir.
cizario

@cizario Yanlış cevaplar çok düşük kaliteli değildir - cevabın yanlış olduğunu düşünüyorsanız, olumsuz oy vermelisiniz. Lütfen bakınız: Açıkça yanlış cevaplar çok düşük kaliteli mi?
EJoshuaS - Monica'yı yeniden etkinleştir

@ EJoshuaS-ReinstateMonica haklısınız ve yorumumu sildim.
cizario
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.