【发布时间】:2021-12-07 12:57:05
【问题描述】:
我已经设置了一个控制器,可以处理我所有的 GET 请求,但是当涉及到 PUT 请求时,我的网站(不是 Web 应用程序,如果那样的话有任何区别)正在返回405。
我在Global.asax Application_Start() 中定义了与其他路由一起定义的路由,并且它是第一个,所以应该先评估它(如果我的理解是正确的):
void Application_Start(object sender, EventArgs e)
{
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls
| System.Net.SecurityProtocolType.Tls11
| System.Net.SecurityProtocolType.Tls12;
RouteTable.Routes.MapHttpRoute("FilteredSpecialOrders",
routeTemplate: "api/sales/filteredRequests",
defaults: new { controller = "Sales", action = "filteredRequests" });
// subsequent routes are here
}
我的 SalesController 有一个方法,该方法具有正确的请求类型 (Put) 属性和与我的 routeTemplate 匹配的操作名称,以及参数上的 [FromBody] 属性:
[HttpPut, ActionName("filteredRequests")]
public IHttpActionResult PutSpecialOrders([FromBody] RequestFilter filter)
{
// do the needful
}
...我的客户端代码将消息体 (filter) 创建为 JavaScript object,并通过 axios 发送 .put 请求:
getFilteredRequests: async function () {
let filter = {
name: this.name,
age: this.yearsOld,
/* other name/value pairs of course */
};
const response = await axios.put(salesApi + 'filteredRequests', filter);
let data = response.data;
return data;
}
...但我总是收到405 - Method Not Allowed. 我忘记了什么?我不确定在正文中发送的 JSON 对象是如何序列化到我的 RequestFilter 对象中的 - 这是自动发生的还是我需要在某个地方定义它?我确保两端的名称相同,但除此之外......
【问题讨论】:
-
检查您的 IIS
web.config,您可能仍然启用了 WebDAV,它会在应用程序代码之前插入自身以处理PUT请求。 -
我在寻找什么?
WebDAV或其他值?因为那里没有关于 WebDAV 的内容。 -
如果您将评论作为答案发表,我会接受。
标签: c# asp.net-web-api axios asp.net-web-api2 asp.net-web-api-routing