c# - 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;
}
}
我在这里缺少什么吗?我已经接近这个问题一天了,我确信它很简单,所以新鲜的眼睛会受到赞赏,因为我是办公室的唯一开发人员!非常感谢您的任何建议。
解决方案
好的。这并不完全是一个答案,但希望我让它工作的程序可能对某人有所帮助。所以我删除了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 设置的。
不理想,因为我喜欢根据对象划分我的方法,例如沙龙、员工、服务等。但是在这上面浪费了一天之后,我只想继续前进,弥补失去的时间。
推荐阅读
- linux - 已解决 - 调试 Darkice 以了解为什么没有连接到直播
- android - 将固定在 XML 顶部的工具栏与固定在 XML 底部的按钮相结合会导致键盘出现 UI 问题
- python - Python 等价于 Matlab shiftdim()
- php - 使用 WooCommerce 中的自定义结帐字段启用/禁用付款方式
- scala - 将 backgroundColor 添加到 TextButton LibGDX 的更简单/更便宜的方法
- python - 网络抓取问题
- c++ - 使用带有模板类型的 OpenMP 时 gcc 报告“不完整类型”错误
- angular - Angular:全局声明目标域/IP
- css - css 样式在 vue 项目中的页面刷新时删除
- angular - 如何处理来自调度组件的 NGXS 操作错误?