2013-03-29 12 views
5

Używam AttributeRouting z moim Web API (MVC 4).Żądany zasób nie obsługuje metody http "PUT"

Dlaczego to działa?

[AcceptVerbs("PUT")] 
    [PUT("api/v1/tokens/current")] 
    public MemoryToken UpdateToken([FromBody] DeviceTokenViewModel viewModel) 
    {...} 

A tego nie robi?

[PUT("api/v1/tokens/current")] 
    public MemoryToken UpdateToken([FromBody] DeviceTokenViewModel viewModel) 
    {...} 

Komunikat o błędzie: Żądany zasób nie obsługuje metody http "PUT". Dlaczego muszę wyraźnie zaakceptować czasownik PUT?

Jestem zdezorientowany, bo coś podobnego z POST działa dobrze (nie mam do określenia przyjętych czasowniki):

[POST("api/v1/tokens")] 
public MemoryToken CreateToken() 
{...} 

z różnych innych stanowisk wierzę, że ma do czynienia z ustawieniem w moim web.config. Sekcja serwer WWW aktualnie wygląda tak:

<system.webServer> 
<validation validateIntegratedModeConfiguration="false" /> 
<modules runAllManagedModulesForAllRequests="true" /> 
<handlers> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    <add name="AttributeRouting" path="routes.axd" verb="*" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" /> 
</handlers> 

Próbowałem kilka rzeczy jak usuwanie protokołu WebDAV i rzeczy. Ale nic nie działało tak daleko (chyba że wyraźnie zezwolono na czasownik PUT w adnotacji).

Och, używam wbudowanego serwera programistycznego Visual Studios.

Dzięki chłopaki!

Odpowiedz

6

W tym link opisują metodę POST jako domyślną, jeśli żadna z akcji nie jest zgodna. Dlatego nadal działa dla metody CreateToken() bez atrybutu HttpPost.

  • Można określić metodę HTTP z atrybutem: AcceptVerbs, HttpDelete, HttpGet, HttpHead, HttpOptions, HttpPatch, HttpPost lub HttpPut.
  • W przeciwnym razie, jeśli nazwa metody kontrolera zaczyna się od "Get", "Post", "Put", "Delete", "Head", "Options" lub "Patch", to zgodnie z konwencją akcja obsługuje to Metoda HTTP.
  • Jeśli żadna z powyższych metod, metoda obsługuje POST.
+0

Witam, dziękuję za wyjaśnienia. Tak, wiem, że mogę określić dozwolone metody HTTP (zobacz pierwszy fragment). I tak myślałem, że jeśli po prostu zmieniam nazwę mojej metody z "UpdateToken" na "PutToken" (choć to nie brzmi dobrze), nie potrzebowałbym atrybutu [AcceptVerbs]. Ale robię. Być może wynika to z AttributeRouting (wspomnianego w pierwszym zdaniu mojego posta). To naprawdę nie jest wielka sprawa. Mogę żyć z ustawianiem atrybutów [AcceptVerbs] tam, gdzie ich potrzebuję. Nie będzie tak dużo. Miałem tylko nadzieję, że zapomnę o tym, poprawiając nieco mój web.config. Dzięki jeszcze raz! – Ingmar

+0

@IngmarBode, próbowałem odtworzyć twój objaw, ale nie mogłem - zmieniłem nazwę metody na Put i na PutToken i działało w obu przypadkach. Spróbuj ponownie i rozważ zaakceptowanie tej odpowiedzi. –

Powiązane problemy