Javascript 方法不允许在WebAPI中执行post

Javascript 方法不允许在WebAPI中执行post,javascript,c#,jquery,asp.net-web-api,Javascript,C#,Jquery,Asp.net Web Api,下面的JavaScript调用该页面 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("ap

下面的JavaScript调用该页面

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();
        }
    }
}
WebApi.config如下所示

            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);
            }
RouteConfig.cs

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 }
            );
        }
    }
}
现在,因为我将要传递大量的数据,所以我需要在主体中传递它(而不是作为Url的一部分)


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

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

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

1.更改web api默认路由

WebApiConfig.cs

config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{action}/{id}”,
默认值:新建{id=RouteParameter.Optional}
);
这样,您就不需要更改html文件

2.更改动作名称

public ihttpackationresult Post([FromBody]String MRNList)

并像这样调用javascript:

$.ajax(“/api/Appointment”,
{类型:“POST”,
数据:$(“”)。val()
...

}

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

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 }
            );
        }
    }
}

我已经有一段时间没有使用jquery了,但是

这不应该吗

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

data: $('#mrnList').val(),
另外,我认为数据类型应该是
'json'


您是否尝试将
[Route(“GetMissingKeys”)]
添加到您的方法中?

请求数据中是否有HTML,如果有,请在参数中使用
[AllowHtml]
属性。不确定属性路由是否将默认为您的方法名称…尝试
[Route(“GetMissingKeys”)]
在您的方法上。没有HTML,我已尝试将Route属性作为well@PaulSChapman您是否尝试过排除
数据类型:“text”
属性或指定其他类型,如“application/json”等?您是否尝试过从一些调试工具(如Fiddler或Advanced Rest Client for Chrome browser)中点击api,并查看发生了什么?这完全是猜测,但可能是WebAPI混淆了它的约定,因为您的方法的前缀是Get。我必须检查源代码以确定。我已经尝试过了,甚至颠倒了路由和HttpPost的顺序,甚至尝试过AcceptVerb@PaulSChapman你能把你的启动类实现添加到你的主程序中吗opic?将尝试找出问题所在。@PaulSChapman我已更改,并在我的答案中添加了一些附加信息。在文章的结尾,您可以找到关于:按操作名称路由的信息。请查看此内容。不确定您的意思,但尝试在RouteConfig.cs中更改url,但这似乎没有什么区别
data : {mrnList: $('#mrnList').val()}, //Or MrnList depending on your jsonformatting options