ASP.NET Web API中不允许HTTP PUT

Mik*_*ley 25 c# iis-7.5 asp.net-web-api

在我的Web API项目中,我无法执行HTTP PUT我的资源.我已经阅读了一些 关于这个问题的类似 问题 , 并且我遵循了建议的建议.

首先,我在我的机器上完全卸载了WebDAV(Windows 7 64位),然后重新启动了我的机器.

其次,WebDAV处理程序在我的指定中被删除,web.config并且HTTP PUT动词被指定为允许无扩展URL处理程序.

<modules runAllManagedModulesForAllRequests="false">
  <remove name="WebDAVModule"/>
</modules>

<handlers>
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
  <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="WebDAV"/>
  <add name="ExtensionlessUrlHandler-Integrated-4.0"
       path="*."
       verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS"
       type="System.Web.Handlers.TransferRequestHandler"
       resourceType="Unspecified"
       requireAccess="Script"
       preCondition="integratedMode,runtimeVersionv4.0" />
  <add name="AttributeRouting" path="routes.axd" verb="*" type="AttributeRouting.Web.Logging.LogRoutesHandler, AttributeRouting.Web" />
</handlers>
Run Code Online (Sandbox Code Playgroud)

我甚至尝试添加ISAPI无扩展URL处理程序(32位和64位)并将我的应用程序从集成管道应用程序池更改为经典应用程序池.

<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" />
Run Code Online (Sandbox Code Playgroud)

我目前正在使用Thinktecture IdentityModel来启用跨源资源共享(CORS)支持.为了我的理智,我已经选择了启用一切以确保HTTP PUT实际允许的核选项.

config.RegisterGlobal(httpConfig);

config.ForAllResources()
      .ForAllOrigins()
      .AllowAllMethods()
      .AllowAllRequestHeaders();
Run Code Online (Sandbox Code Playgroud)

属性路由 NuGet包被构造成拾取从当前组件的所有路由和的任何亚型ApiController.

config.AddRoutesFromAssembly(Assembly.GetExecutingAssembly());
config.AddRoutesFromControllersOfType<ApiController>();
Run Code Online (Sandbox Code Playgroud)

我的资源也PUT正确指定了属性.

[PUT("/API/Authenticate/Link/{key}/{identifier}")]
public Boolean LinkUser(Guid key, String identifier) { ... }
Run Code Online (Sandbox Code Playgroud)

我在这个问题上查看的每个资源都推荐了同样的东西:卸载WebDAV,禁用WebDAV处理程序并确保正确配置了Extensionless URL处理程序.我已经做了所有这些,但它仍然无效.

在小提琴手中,我得到以下内容:

PUT https://localhost/Test/API/Authenticate/Link/Foo/Bar

{"Message":"The requested resource does not support http method 'PUT'."}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Mik*_*ley 19

显然,存在一个已知问题,AttributeRouting其中HttpPut方法当前在ASP.NET Web API中不起作用.

目前公认的解决方法是添加合适的动词到路线直至适当的修复走来:

Web API RC密封了底层框架进行路由检测的重要接口.虽然界面现已公开,但直到vNext才会发布更改.所以这里有一些解决方法:

  • 将AR属性与System.Web.Http中的HttpGet,HttpPost,HttpPut或HttpDelete属性结合使用:
[GET("some/url"), HttpGet]
public string Method1() {}

[PUT("some/url"), HttpPut]
public string Method2() {}

[POST("some/url"), HttpPost]
public string Method3() {}

[DELETE("some/url"), HttpDelete]
public string Method4() {}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ski 12

仔细检查你使用的[HttpPut]System.Web.Http.

在某些情况下,您最终可以使用System.Web.Mvc中的属性.

这对我们来说是405s.


归档时间:

查看次数:

32573 次

最近记录:

9 年,6 月 前