C# WebApi2请求的资源不支持post
我读过很多类似的帖子,它们描述了相同的错误消息,但它们似乎与我所经历的不匹配 我最近开始使用webapi,并在返回JSON等的地方删除了所有MVC方法,因此MVC将只呈现html,我将通过ajax从webapi控制器调用模型 奇怪的是,我可以从我家的apiController获取和发布(这样我就可以登录/注册等),但我只能从我创建的区域的API控制器获取。我得到一个405(不允许使用方法),尽管它的装饰和调用方式与其他控制器相同。我想路由是可以的,否则它不会返回我的初始get 路由C# WebApi2请求的资源不支持post,c#,asp.net,ajax,asp.net-web-api,C#,Asp.net,Ajax,Asp.net Web Api,我读过很多类似的帖子,它们描述了相同的错误消息,但它们似乎与我所经历的不匹配 我最近开始使用webapi,并在返回JSON等的地方删除了所有MVC方法,因此MVC将只呈现html,我将通过ajax从webapi控制器调用模型 奇怪的是,我可以从我家的apiController获取和发布(这样我就可以登录/注册等),但我只能从我创建的区域的API控制器获取。我得到一个405(不允许使用方法),尽管它的装饰和调用方式与其他控制器相同。我想路由是可以的,否则它不会返回我的初始get 路由 publi
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultAreaApi",
routeTemplate: "api/{area}/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
控制器
// Returns Model
[HttpGet]
public HttpResponseMessage SelectAgent()
// The requested resource does not support http method 'POST'.
[HttpPost]
public HttpResponseMessage SelectAgent(Guid id)
JQuery
// Works fine
$.ajax({
type: 'POST',
url: '/api/Home/Login',
headers: options.headers,
contentType: "application/json; charset=utf-8",
dataType: 'JSON',
data: ko.toJSON(self.serverModel),
success: function (response) {
// Works fine
$.getJSON("/api/Account/Users/SelectAgent", function (model) { ....
// 405
$.ajax({
type: 'POST',
url: '/api/Account/Users/SelectAgent',
headers: options.headers,
contentType: "application/json; charset=utf-8",
dataType: 'JSON',
data: "{'id':'" + selectModel.agentId() + "'}",
success: function (response) {....
正在传递的数据看起来很好(或者至少对于它以前使用的MVC控制器来说是这样)
我根本没有修改Home API控制器,我不知道如何发布到它,而不是我的另一个控制器。啊
任何指向正确方向的指针都非常棒。WebAPI只查看基本数据类型的查询字符串参数。因此,当你发表文章时,你的文章只是查看
/api/Account/Users/SelectAgent
的url。在与函数匹配时不考虑提交的数据,因为您没有使用[FromBody]
属性标记Guid
。因此返回“methodnotallowed”错误,因为它正在将POST请求发送到GET方法(无参数)
您可以通过以下网站了解更多信息:
如果参数是“简单”类型,Web API将尝试从URI获取值。简单类型包括.NET基本类型(int、bool、double等),加上TimeSpan、DateTime、Guid、decimal和string,再加上任何带有可从字符串转换的类型转换器的类型。(稍后将详细介绍类型转换器。)
要解决此问题,请尝试执行以下操作之一:
id
url:'/api/Account/Users/SelectAgent?id='+selectModel.agentId()
:
public-httpresponsemessageselectagent([FromBody]Guid-id)
我知道这是一个老问题,但这个答案可能会帮助一些人。更改操作签名以读取Id FromBody:对我来说不起作用,我想知道当您有一个包含许多字段/成员的复杂类型时,将参数传递给querystring有多容易 这个问题是因为传统路由和基于动词的路由不能在同一个ApiController中使用。看见 您可以通过向POST-action方法添加空的
[Route]
属性来解决此问题。即:-
[HttpPost]
[Route]
public HttpResponseMessage SelectAgent(Guid id)
当post和get函数的名称相同时,它将路由到get函数。这就是你得到这个答案的原因。今天最简单的方法是
[HttpPost]
[Route("api/postagent", Name ="postagent")]
public HttpResponseMessage SelectAgent(Guid id)
只需为post函数定义一个路由,然后在客户端用
例如,host+/api/postagent。您可以通过此链接找到更详细的信息
如果您通过在新控制器中生成api控制器来创建api控制器,这将特别有用。预定义函数将具有诸如get和post方法等结构,它们将具有相同的路由。您需要重新定义其中一个或两个,以将它们分开
真是太好了,非常感谢,我将把这作为答案。您是否知道是否可以在默认情况下覆盖此行为,使其更像MVC控制器?(不要想改变大量的ajax--)。我删除了我的旧评论,因为与Web API绑定器的默认行为作斗争似乎是一个坏主意,这只会让人头疼。我最好的建议是遵循Yaakovs的建议,将简单类型放入查询字符串中。