Core 2 Controller - 不允许HTTP动词

时间:2017-10-21 20:39:25

标签: c# asp.net-core-2.0

我有一个控制器,我在Restful API中使用它作为.NET Core 2 MVC应用程序的一部分。我已粘贴下面控制器的代码。

除最后一种方法外,一切都很有效。 [HttpDelete("Race/{raceid}")]。当我尝试从Postman或Swagger发出DELETE时,我得到"用于访问此页面的HTTP动词不允许"

我无法理解为什么。我的标准Delete方法正常。这只是第二种删除方法。我有类似模式的GET方法,它们工作正常。

有什么想法吗?

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;
using System.Linq;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using System;
using TechsportiseOnline.Data;
using Microsoft.AspNetCore.Identity;
using TechsportiseOnline.Models;

// For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860

namespace Techsportise.Controllers
{
    [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
    [Route("api/[controller]")]
    public class TimingController : Controller
    {
        private readonly ApplicationDbContext _context;
        private readonly UserManager<ApplicationUser> _userManager;
        private readonly IAuthorizationService _authorizationService;

        public TimingController(ApplicationDbContext context, IAuthorizationService authorizationService,
           UserManager<ApplicationUser> userManager)
        {
            _context = context;
            _userManager = userManager;
            _authorizationService = authorizationService;


        }

        /// <summary>
        /// Get all Race Timings by Race ID
        /// </summary>
        /// <remarks>
        /// Gets all Race Timings which have been recorded by the user for the passed race
        /// </remarks>s
        /// <param name="raceid">Race ID</param>
        /// <returns>All created Race Timings</returns>
        [HttpGet("Race/{raceid}", Name = "GetTimingsByRaceID")]
        public IEnumerable<Timing> GetAllByRaceID(long raceid)
        {

            //Get only records where the OwnerID is not the logged in User.

            var alltimings = _context.Timings.Where(p => p.OwnerId == _userManager.GetUserId(User))
                                     .Where(p => p.RaceId == raceid);
            return alltimings.ToList();
        }

        /// <summary>
        /// Get Count of Timings by Race ID
        /// </summary>
        /// <remarks>
        /// Gets a count of all Race Timings which have been recorded by the user for the passed race
        /// </remarks>s
        /// <param name="raceid">Race ID</param>
        /// <returns>All created Race Timings</returns>
        [HttpGet("Race/{raceid}/count", Name = "GetTimingsCountByRaceID")]
        public IActionResult GetCountByRaceID(long raceid)
        {
            //Get only records where the OwnerID is not the logged in User.
            var count = _context.Timings.Where(p => p.OwnerId == _userManager.GetUserId(User))
                                .Where(p => p.RaceId == raceid)
                                .Count();
            var response = new TimingCount()
            {
                RaceId = raceid,
                TimingsCount = count
            };

            return new ObjectResult(response);
        }

        /// <summary>
        /// Get a single Race Timing
        /// </summary>
        /// <remarks>
        /// Gets the details from a single Race Timing from it's ID
        /// </remarks>
        /// <param name="id">Timing ID</param>
        /// <returns>Single Race Timing</returns>
        [HttpGet("{id}", Name = "GetTiming")]
        public IActionResult GetById(long id)
        {
            var item = _context.Timings .Where(t => t.OwnerId == _userManager.GetUserId(User))
                                        .FirstOrDefault(t => t.Id == id);
            if (item == null)
            {
                return NotFound();
            }
            return new ObjectResult(item);
        }

        /// <summary>
        /// Create a new Race Timing
        /// </summary>
        /// <remarks>
        /// Creates a new Race Timing 
        /// </remarks>
        /// <returns>The JSON for the created Race Timing</returns>
        [HttpPost]
        public IActionResult Create([FromBody] TimingPost item)
        {
            if (item == null)
            {
                return BadRequest();
            }

            //Validate that the race ID exists
            var race = _context.Races.Where(p => p.OwnerID == _userManager.GetUserId(User)).FirstOrDefault(t => t.ID == item.RaceId);
            if (race == null)
            {
                return BadRequest("The RaceID you have sent does not exist");
            }

            var timingitem = new Timing();

            timingitem.EndTime = item.EndTime;
            timingitem.RaceId = item.RaceId;
            timingitem.OwnerId = _userManager.GetUserId(User);
            timingitem.Position = item.Position;
            timingitem.StartTime = item.StartTime;
            timingitem.LastUpdated = DateTime.Now;

            _context.Timings.Add(timingitem);

            _context.SaveChanges();

            return CreatedAtRoute("GetTiming", new { id = timingitem.Id }, timingitem);
        }

        /// <summary>
        /// Update a Race Timing
        /// </summary>
        /// <remarks>
        /// Update's a Race Timing's details
        /// </remarks>
        /// <param name="id">Timing ID</param>
        /// <returns>The JSON for the updated Race Timing</returns>
        [HttpPut("{id}")]
        public IActionResult Update(long id, [FromBody] Timing item)
        {
            if (item == null)
            {
                return BadRequest();
            }

            //Validate that the race ID exists
            var race = _context.Races.Where(p => p.OwnerID == _userManager.GetUserId(User)).FirstOrDefault(t => t.ID == item.RaceId);
            if (race == null)
            {
                return BadRequest("The RaceID you have sent does not exist");
            }

            var timing = _context.Timings   .Where(t => t.OwnerId == _userManager.GetUserId(User))
                                            .FirstOrDefault(t => t.Id == id);
            if (timing == null)
            {
                return NotFound();
            }
            timing.RaceId = item.RaceId;
            timing.StartTime = item.StartTime;
            timing.EndTime = item.EndTime;
            timing.Position = item.Position;
            timing.OwnerId = _userManager.GetUserId(User);
            timing.LastUpdated = DateTime.Now;

            _context.Timings.Update(timing);
            _context.SaveChanges();

            return new NoContentResult();
        }

        /// <summary>
        /// Delete a Race Timing
        /// </summary>
        /// <remarks>
        /// Deletes a Race Timing. Note: This will orphan any related result data and is not recommended!
        /// </remarks>
        /// <param name="id">Race Entry ID</param>
        /// <returns></returns>
        [HttpDelete("{id}")]
        public IActionResult Delete(long id)
        {
            var timing = _context.Timings   .Where(t => t.OwnerId == _userManager.GetUserId(User))
                                            .FirstOrDefault(t => t.Id == id);
            if (timing == null)
            {
                return NotFound();
            }

            _context.Timings.Remove(timing);
            _context.SaveChanges();
            return new NoContentResult();
        }

        /// <summary>
        /// Delete all timings for a Race
        /// </summary>
        /// <remarks>
        /// Deletes all timings for the race passed
        /// </remarks>
        /// <param name="raceid">Race ID</param>
        /// <returns></returns>
        [HttpDelete("Race/{raceid}")]
        public IActionResult DeleteAllTimingsForRace(long raceid)
        {
            var race = _context.Races.Where(t => t.OwnerID == _userManager.GetUserId(User))
                                            .FirstOrDefault(t => t.ID == raceid);
            if (race == null)
            {
                return NotFound();
            }

            if ((race.ResultStatus == "Published") || (race.ResultStatus == "Provisional"))
            {
                return BadRequest("You cannot delete scans for a race which is already published");
            }


            foreach (var timing in _context.Timings.Where(p => p.OwnerId == _userManager.GetUserId(User))
                                                            .Where(p => p.RaceId == raceid))
            {
                _context.Timings.Remove(timing);
            }
            _context.SaveChanges();
            return new NoContentResult();
        }
    }


}

1 个答案:

答案 0 :(得分:0)

这实际上最终成为与WebDAV相关的服务器配置。

我最终在3个本地环境中进行了测试,没有任何问题,因此将其与服务器隔离,然后进行了更多的取证搜索,将其缩小为在我的Web.Config中禁用了ddloyed服务器上的WebDAV。

      <modules runAllManagedModulesForAllRequests="false">
        <remove name="WebDAVModule" />
      </modules>