首页 > 解决方案 > MVC 和 Web Api:请求的资源不支持 http 方法“POST”

问题描述

因此,我查看了与此问题相关的所有问题,并尝试了所有建议均无济于事。我在 Visual Studio 2019 中有一个由多个 MVC 项目组成的解决方案。我想添加一个我已经完成的 Web 服务。到目前为止一切都很好。因此,我使用 ajax 对该 Web 服务进行了调用,因此:

            var apiLocation = getHostname(window.location.href, 0) + "/OLBWebService/api/";
            var obj = { "id": $('#salonDDL').val() };

            // populate the services drop down list based on the salon ID
            $.ajax({
                type: "POST",
                headers: {
                            'Content-Type': 'application/json', /*or whatever type is relevant */
                            'Accept': 'application/json' /* ditto */
                        },
                datatype: "json",  
                url: apiLocation + "Service/GetServicesForSalon",
                data: JSON.stringify(obj),  
                success: function (response) {
                    if (response.length > 0) {
                        $('#serviceDDL').empty();
                        var options = '';
                        options += "<option value='0' selected>Please select a service</option>";
                        for (var i = 0; i < response.length; i++) {
                            options += '<option value="' + response[i].Id + '">' + response[i].Name + '</option>';
                        }
                        $('#serviceDDL').append(options);
                    }
                },
                fail: function (error) {
                    alert(error.StatusText);
                }
            });

我目前在 WebApiConfig.cs 中有我的路由,因此:

            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

我用这样的方法设置了一个控制器:(HttpPost 被定义为来自 System.Web.Http 命名空间)

        [HttpPost]
        public IHttpActionResult GetServicesForSalon([FromBody]DefaultParams passedParams)
        {
            List<Service> service = new List<Service>();
            service = _ServiceService.GetServicesBySalonID(passedParams.id);

            try
            {
                return Json(service.Select(s => new { Id = s.ID, Name = s.Description }).OrderBy(s => s.Name));
            }
            catch (Exception ex)
            {
                _loggingService.LogError(ex, "Error in GetServicesForSalon with id of:" + passedParams.id.ToString());
                return null;
            }
        }

传入的 DefaultParams 是这样定义的:

    public class DefaultParams
    {
        public int id { get; set; }
    }

当我通过 Visual Studio 2019 在调试模式下或使用 Fiddler 运行它时,我收到消息“请求的资源不支持 http 方法'POST'”。

奇怪的是,在这个有效的之前我有一个 ajax 调用。(语法是我一直使用的原始语法,我在问题调用中尝试过这种语法)

            $.ajax({  
                type: "POST",  
                url: apiLocation + "Salon/GetSalonsByOrg",  
                data: JSON.stringify(obj),  
                contentType: "application/json",  
                datatype: "json",  
                success: function (response) {
                    if (response.length > 0) {
                        $('#salonDDL').empty();
                        var options = '';
                        options += "<option value='0' selected>Please select a salon</option>";
                        for (var i = 0; i < response.length; i++) {
                            options += '<option value="' + response[i].Id +'">' + response[i].Name + '</option>';
                        }

                        $('#salonDDL').append(options);
                    } 
                },
                fail: function (error) {
                    alert(error.StatusText);
                }
            });

控制器是一个不同的控制器,方法是这样定义的:(HttpPost 被定义为来自 System.Web.Http 命名空间)

        [HttpPost]
        public IHttpActionResult GetSalonsByOrg([FromBody]GetSalonsByOrgParams passedParams)
        {
            List<Salon> salons = new List<Salon>();
            salons = _SalonService.GetSalonsByOrg(passedParams.id);

            try
            {
                if (passedParams.filter != null)
                {
                    return Json(salons.AsEnumerable().Where(s => s.City.ToLower().Contains(passedParams.filter.ToLower())).Select(s => new { Id = s.ID, Name = s.Name }).OrderBy(s => s.Name).ToList());
                }
                else
                {
                    return Json(salons.Select(s => new { Id = s.ID, Name = s.Name }).OrderBy(s => s.Name));
                }
            }
            catch (Exception ex)
            {
                _loggingService.LogError(ex, "Error in GetSalonsByOrg with filter of:" + passedParams.filter);
                return null;
            }
        }

我在这里缺少什么吗?我已经接近这个问题一天了,我确信它很简单,所以新鲜的眼睛会受到赞赏,因为我是办公室的唯一开发人员!非常感谢您的任何建议。

标签: c#apimodel-view-controller

解决方案


好的。这并不完全是一个答案,但希望我让它工作的程序可能对某人有所帮助。所以我删除了Web Service项目并重新开始。添加了一个新项目 Asp.Net Web 应用程序 API。这会自动在您的 App_Start 文件夹中设置一个 WebApiConfig.cs 文件。路由不起作用,因为它设置为 routeTemplate:“api/{controller}/{id}”,所以我将其设置为 routeTemplate:“api/{controller}/{action}/{id}”,

您还设置了 ValuesController。一旦更改了路由,就可以使用默认的 GET 和 POST 方法。

接下来我添加了我的 GetServicesForSalon 方法。它仍然在 [FromBody] 中传递了 DefaultParams,但没有声明 int id {get;set;} 我将其更改为字符串,例如 string id {get;set;}

嘿,很快,它奏效了。

我刚刚设置了另一个控制器(ServiceController)并将代码复制到其中看看会发生什么。除了名称(显然)相同。它不起作用。所以https://localhost/OLBWebService/api/Values/GetServicesForSalon有效。但。 https://localhost/OLBWebService/api/Service/GetServicesForSalon不起作用?

因此,您似乎仅限于 1 个继承 ApiController 的控制器。不知道为什么会这样,但我现在有多个 GET 和 POST 方法在 ValuesController 中工作,这是在我添加项目时由 VS 设置的。

不理想,因为我喜欢根据对象划分我的方法,例如沙龙、员工、服务等。但是在这上面浪费了一天之后,我只想继续前进,弥补失去的时间。


推荐阅读