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