【发布时间】:2017-12-15 17:44:56
【问题描述】:
我正在开发一个 ASP.NET Web API。我正在尝试使用 Put http 调用来更新某些资源。
我一直在搜索,有很多可能的配置,但我无法找到适合我的配置。
我按照惯例使用端点。控制器上没有路由,只有我要执行的函数的名称。
public IHttpActionResult Put([FromBody]JObject data)
{
return this.ExecuteWithErrorHandling(() =>
{
return Ok();
});
}
问题是,当我从我的网络应用程序调用它时,首先调用的是 OPTIONS。我得到一个 405 错误。
所以我发现,如果我从网络配置中删除 OPTIONSVerbHandler 和 ExtensionlessUrlHandler-Integrated-4.0,我可以在选项调用中获得 200。
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" /> <-- Remove this line -->
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> <-- Remove this line -->
</handlers>
但问题是,在此之后,当我在 api 上调用我的 Put 函数时,我得到 404。
我正在使用 IIS express。所以我去了 IIS 的配置文件,并在 handlers 部分添加了缺少的动词。
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
还要在 web config 上添加值以删除 WebDAV
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
</modules>
和
<handlers>
<remove name="WebDAV" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
注意到当我从邮递员发出选项调用时,我看不到 Put 方法。
控制器完整代码:
using Newtonsoft.Json.Linq;
using Rev.API.Controllers.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace Rev.API.Controllers
{
public class TestController : BaseApiController
{
public IHttpActionResult Get()
{
return this.ExecuteWithErrorHandling(() =>
{
int[] arr1 = new int[] { 3, 4, 5 }
return Ok(arr1);
});
}
public IHttpActionResult Get(string id)
{
return this.ExecuteWithErrorHandling(() =>
{
int Id = Convert.ToInt32(id);
return Ok(Id);
});
}
[System.Web.Http.HttpPut]
public IHttpActionResult Put([FromBody]JObject data)
{
return this.ExecuteWithErrorHandling(() =>
{
return Ok();
});
}
}
}
但问题仍然存在。不知道我错过了什么。
【问题讨论】:
-
首先,如果您的 API 存在于与您的 Web 应用程序不同的域/端口上,并且您的 Web 应用程序是基于浏览器的,那么您的 API 将必须支持 CORS。由浏览器发送的初始 OPTIONS 请求称为预检,用于向 API 查询该端点的允许来源和方法。 CORS 实现被设计为一种解决/使用浏览器同源策略的方法,该策略由浏览器作为安全措施实施。
-
是的,完全同意你的看法。正如我在这个问题上提到的。我在看跌期权之前得到了 200 的期权。但是当 put call 发生时,我得到 404。可能不是很清楚。
-
只是为了澄清一下,在注册的 WebApiConfig 上,我添加了 Eneable cors: var cors = new EnableCorsAttribute("", "", "*"); config.EnableCors(cors);
-
我也遵循 IIS express 的说明:stevemichelotti.com/…
-
你可以为你的控制器添加完整的代码吗?
标签: asp.net http asp.net-web-api put