方法不允许在 WebAPI 中发帖

Method not allowed doing a post in WebAPI

本文关键字:WebAPI 不允许 方法      更新时间:2023-09-26
I have a controller defined as follows
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
namespace MissingClinics.Controllers
{
    [RoutePrefix("api/appointment")]
    public class AppointmentController : ApiController
    {
        [HttpPost]
        public IHttpActionResult GetMissingKeys([FromBody]String MRNList)
        {
            return Ok();
        }
    }
}

以下 JavaScript 调用该页面。

            try {
                $.ajax({
                    type: 'POST',
                    url: '/api/Appointment/GetMissingKeys',
                    data: $('#mrnList').val(),
                    dataType: 'text'
                }).done(function () {
                    alert('done!');
                }).fail(function (Status, errorThrown) {
                    alert('Error: ' + Status.status + ' - ' + Status.statusText);
                }).always(function () {
                    alert('All done or not');
                });
            }
            catch (e) {
                alert(e);
            }

WebApi.config 如下

namespace MissingClinics
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Web API routes
            config.MapHttpAttributeRoutes();
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}

路由配置.cs

namespace MissingClinics
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

现在,因为我将传递大量数据,所以我需要在正文中传递它(而不是作为 URL 的一部分(。

但在调用中,它返回错误 405 - 方法不允许。但是从我所看到的情况来看,jquery 应该发出一个发布请求并且控制器正在接受一个帖子 - 那么为什么不允许使用该方法呢?

使用默认路由模板,Web API 使用 HTTP 方法来选择操作。但是,您也可以创建在 URI 中包含操作名称的路由:

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

Routing instructions

自从我使用 jquery 以来已经有一段时间了,但是

这不应该吗

data: $('#mrnList').val(),

是这个

data : {mrnList: $('#mrnList').val()}, //Or MrnList depending on your jsonformatting options

我认为数据类型也应该'json'

您是否尝试过向方法中添加[Route("GetMissingKeys")]

您是否将默认路由从 api/{action} 更改为 api/{controller}/{action}/{id}

ASP.NET WEB API 使用请求 HTTP 方法选择操作,有两种方法:

1.更改网页接口默认路由

WebApiConfig.cs


config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{action}/{id}", defaults: new { id = RouteParameter.Optional } );有了这个,你不需要改变你的html文件。

2.更改操作名称

public IHttpActionResult Post([FromBody]String MRNList)

并像这样调用JavaScript:

$.ajax("/api/Appointment", {type:"POST", data:$("").val() ... }