2013-03-29 14 views
5

Ich verwende AttributeRouting mit meiner Web-API (MVC 4).Angeforderte Ressource unterstützt keine HTTP-Methode "PUT"

Warum funktioniert das?

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

Und dies nicht?

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

Fehlermeldung: Die angeforderte Ressource http-Methode "PUT" nicht unterstützt. Warum muss ich das Verb PUT explizit akzeptieren?

Ich bin nur verwirrt, weil etwas ähnliches mit POST funktioniert gut (ich muss nicht die akzeptierten Verben angeben):

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

Von verschiedenen anderen Beiträgen Ich glaube, es mit der Einstellung zu tun hat in meiner web.config. Der Web-Server-Abschnitt sieht derzeit wie folgt aus:

<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> 

ich ein paar Dinge ausprobiert wie WebDav und Sachen zu entfernen. Bisher hat jedoch noch nichts funktioniert (es sei denn, das PUT-Verb wurde ausdrücklich in der Annotation zugelassen).

Oh, ich benutze Visual Studios integrierten Entwicklungsserver.

Danke Jungs!

Antwort

6

In dieser link beschreiben sie die POST-Methode als Standard, wenn keine der Aktionen übereinstimmen. Aus diesem Grund funktioniert es immer noch für Ihre CreateToken() -Methode ohne ein HttpPost-Attribut.

  • Sie können die HTTP-Methode mit einem Attribut angeben: AcceptVerbs, HttpDelete, HttpGet HttpHead, HttpOptions, HttpPatch, Httppost, oder HttpPut.
  • Wenn der Name der Controller-Methode mit "Get", "Post", "Put", "Delete", "Head", "Options" oder "Patch" beginnt, unterstützt dies die Konvention HTTP-Methode
  • Wenn keine der oben genannten, unterstützt die Methode POST.
+0

Hallo, danke für deine Erklärungen. Ja, ich weiß, dass ich die erlaubten HTTP-Methoden angeben kann (siehe erstes Snippet). Und ich dachte auch, wenn ich meine Methode nur von "UpdateToken" zu "PutToken" umbenenne (obwohl das nicht nett klingt), würde ich das Attribut [AcceptVerbs] nicht brauchen. Aber ich tue. Vielleicht liegt das an dem AttributeRouting (erwähnt im ersten Satz meines Posts). Es ist eigentlich keine große Sache. Ich kann mit der Einstellung der [AcceptVerbs] -Attribute leben, wo immer ich sie brauche. Wird nicht so viel sein. Ich hatte nur gehofft, dass ich das vergessen konnte, indem ich meine web.config ein wenig änderte. Danke noch einmal! – Ingmar

+0

@IngmarBode, ich habe versucht, Ihr Symptom zu reproduzieren, konnte aber nicht - ich habe den Methodennamen in Put und PutToken geändert und es funktionierte in beiden Fällen. Bitte versuchen Sie erneut, diese Antwort zu akzeptieren. –

Verwandte Themen