Javascript 方法不允许在WebAPI中执行post
下面的JavaScript调用该页面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
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