Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebApi2请求的资源不支持post_C#_Asp.net_Ajax_Asp.net Web Api - Fatal编程技术网

C# WebApi2请求的资源不支持post

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

我读过很多类似的帖子,它们描述了相同的错误消息,但它们似乎与我所经历的不匹配

我最近开始使用webapi,并在返回JSON等的地方删除了所有MVC方法,因此MVC将只呈现html,我将通过ajax从webapi控制器调用模型

奇怪的是,我可以从我家的apiController获取和发布(这样我就可以登录/注册等),但我只能从我创建的区域的API控制器获取。我得到一个405(不允许使用方法),尽管它的装饰和调用方式与其他控制器相同。我想路由是可以的,否则它不会返回我的初始get

路由

 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,再加上任何带有可从字符串转换的类型转换器的类型。(稍后将详细介绍类型转换器。)

要解决此问题,请尝试执行以下操作之一:

  • 更改您正在提交的url,以便在电子邮件的查询字符串中包含
    id

    url:'/api/Account/Users/SelectAgent?id='+selectModel.agentId()

  • 将操作签名更改为从正文中读取Id

    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的建议,将简单类型放入查询字符串中。