Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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
什么';导致ASP.NET MVC应用程序中POST方法出现405错误的原因是什么?_Asp.net_Asp.net Mvc_Entity Framework_Asp.net Web Api - Fatal编程技术网

什么';导致ASP.NET MVC应用程序中POST方法出现405错误的原因是什么?

什么';导致ASP.NET MVC应用程序中POST方法出现405错误的原因是什么?,asp.net,asp.net-mvc,entity-framework,asp.net-web-api,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Web Api,我正在尝试测试一个ASP项目的CRUD操作,我刚刚添加了WEB.API脚手架。我正在通过邮递员测试操作。脚手架控制器附带的所有请求方法都可以工作并成功地查询数据库,POST方法除外。每次我试图通过Postman向表中插入一个新项目时,都会出现405错误。我正在使用原始JSON插入查询,并且已禁用IIS的WEBDAV。我还通过Fiddler尝试了这种方法,得到了同样的错误。我没有做任何事情来改变这个方法,或者其他任何方法,所以我不确定这是怎么发生的,或者是什么原因造成的 这是我到目前为止一直在测试

我正在尝试测试一个ASP项目的CRUD操作,我刚刚添加了WEB.API脚手架。我正在通过邮递员测试操作。脚手架控制器附带的所有请求方法都可以工作并成功地查询数据库,POST方法除外。每次我试图通过Postman向表中插入一个新项目时,都会出现405错误。我正在使用原始JSON插入查询,并且已禁用IIS的WEBDAV。我还通过Fiddler尝试了这种方法,得到了同样的错误。我没有做任何事情来改变这个方法,或者其他任何方法,所以我不确定这是怎么发生的,或者是什么原因造成的

这是我到目前为止一直在测试的控制器。我唯一添加的是顶部的products标记

[Produces("application/json")]
    [Route("api/contracts")]
    [ApiController]
    public class ContractsController : ControllerBase
    {
        private readonly PortalWizardContext _context;

        public ContractsController(PortalWizardContext context)
        {
            _context = context;
        }

        // GET: api/Contracts
        [HttpGet]
        public async Task<ActionResult<IEnumerable<Contracts>>> GetContracts()
        {
            return await _context.Contracts.ToListAsync();
        }

        // GET: api/Contracts/5
        [HttpGet("{id}")]
        public async Task<ActionResult<Contracts>> GetContracts(int id)
        {
            var contracts = await _context.Contracts.FindAsync(id);

            if (contracts == null)
            {
                return NotFound();
            }

            return contracts;
        }

        // PUT: api/Contracts/5
        [HttpPut("{id}")]
        public async Task<IActionResult> PutContracts(int id, Contracts contracts)
        {
            if (id != contracts.ContractId)
            {
                return BadRequest();
            }

            _context.Entry(contracts).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!ContractsExists(id))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return NoContent();
        }

        // POST: api/Contracts
        [HttpPost]
        public async Task<ActionResult<Contracts>> PostContracts(Contracts contracts)
        {
            _context.Contracts.Add(contracts);
            await _context.SaveChangesAsync();

            return CreatedAtAction("GetContracts", new { id = contracts.ContractId }, contracts);
        }

        // DELETE: api/Contracts/5
        [HttpDelete("{id}")]
        public async Task<ActionResult<Contracts>> DeleteContracts(int id)
        {
            var contracts = await _context.Contracts.FindAsync(id);
            if (contracts == null)
            {
                return NotFound();
            }

            _context.Contracts.Remove(contracts);
            await _context.SaveChangesAsync();

            return contracts;
        }

    }
以下是邮递员请求的结果

如果我在没有ID的情况下尝试请求,那么我会得到500个错误

非常感谢您的建议

更新:


我发现了问题。这是服务器端。表脚本中存在一个不允许定义主键(construcd)的约束。相反,它的值将通过增量自动分配。一旦我从Postman中的JSON表达式中删除了压缩列,它就成功插入了。

发送请求时应该没有
POST
的ID。在
POST
方法上放置断点,它是否在不使用ID的情况下命中该方法?您之所以得到405,是因为当您使用id发送请求时,没有与
[HttpPost(“{id}”)]
匹配的方法谢谢您的响应。是的,当我在没有ID的情况下运行URL时,断点会命中,但随后它会给我一个500内部服务器错误。当我在request method属性中包含ID并使用ID运行URL时,它还会给我一个500错误。如果它点击了
HttpPost
方法,你能进入该方法吗?它在哪条线路上出故障?您可以将
try{}catch(Exception ex){}
放入方法中,捕获所有异常并查看问题所在。根据您的屏幕截图,您将获得
405 method Not Allowed
并将头值传递为DELETE、GET、put to POST方法。请添加文章标题并从URL中删除Id,然后放入
尝试{}catch(异常示例{}
,以查看您得到的错误
\u context.savechangessync()这里。好的,我删除了ID,并将方法的内容放在一个try-catch表达式中。现在,当我在Postman中使用相同的主体数据运行URL时,它会给我一条201创建的消息。然而,当我在SQLServer中运行GET请求或检查数据库时,它实际上并没有向表中插入任何内容。我将断点放在向dbcontext添加数据的行上,以及return语句上,两者都被命中。发送请求时应该没有
POST
的ID。在
POST
方法上放置断点,它是否在不使用ID的情况下命中该方法?您之所以得到405,是因为当您使用id发送请求时,没有与
[HttpPost(“{id}”)]
匹配的方法谢谢您的响应。是的,当我在没有ID的情况下运行URL时,断点会命中,但随后它会给我一个500内部服务器错误。当我在request method属性中包含ID并使用ID运行URL时,它还会给我一个500错误。如果它点击了
HttpPost
方法,你能进入该方法吗?它在哪条线路上出故障?您可以将
try{}catch(Exception ex){}
放入方法中,捕获所有异常并查看问题所在。根据您的屏幕截图,您将获得
405 method Not Allowed
并将头值传递为DELETE、GET、put to POST方法。请添加文章标题并从URL中删除Id,然后放入
尝试{}catch(异常示例{}
,以查看您得到的错误
\u context.savechangessync()这里。好的,我删除了ID,并将方法的内容放在一个try-catch表达式中。现在,当我在Postman中使用相同的主体数据运行URL时,它会给我一条201创建的消息。然而,当我在SQLServer中运行GET请求或检查数据库时,它实际上并没有向表中插入任何内容。我将断点放在向dbcontext添加数据的行上,以及return语句上,两者都会被命中。
app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action=Index}/{id?}");
            });