6

Web API (MVC 4) で AttributeRouting を使用しています。

なぜこれが機能するのですか?

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

そして、これはそうではありませんか?

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

エラー メッセージ: 要求されたリソースは http メソッド "PUT" をサポートしていません。PUT動詞を明示的に受け入れる必要があるのはなぜですか?

POST と同様のものが正常に機能するため、混乱しています (受け入れられた動詞を指定する必要はありません)。

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

他のさまざまな投稿から、web.config の設定に関係していると思います。現在、Web サーバー セクションは次のようになっています。

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

WebDav などを削除するなど、いくつかのことを試しました。しかし、これまでのところ何も機能していません (注釈で PUT 動詞を明示的に許可しない限り)。

ああ、私は Visual Studio のビルトイン開発サーバーを使用しています。

みんなありがとう!

4

1 に答える 1

6

このリンクでは、どのアクションも一致しない場合のデフォルトとして POST メソッドを説明しています。そのため、 HttpPost 属性がなくても CreateToken() メソッドで引き続き機能します。

  • 属性を使用して HTTP メソッドを指定できます: AcceptVerbs、HttpDelete、HttpGet、HttpHead、HttpOptions、HttpPatch、HttpPost、または HttpPut。
  • それ以外の場合、コントローラー メソッドの名前が "Get"、"Post"、"Put"、"Delete"、"Head"、"Options"、または "Patch" で始まる場合、慣例により、アクションはその HTTP メソッドをサポートします。
  • 上記のいずれでもない場合、メソッドは POST をサポートします。
于 2013-03-29T12:59:23.593 に答える