Asp.net mvc 4 ASP.NETMVC4WebAPI发布返回404
我看了很多类似的问题,但是找不到一个适合我的解决方案。因此,对Get的调用工作正常,但对POST的调用返回404。我创建了一个简单的WebAPI项目(MVC4) 我创建了另一个项目(ASP.Net),其中包含一个html文件,代码如下:Asp.net mvc 4 ASP.NETMVC4WebAPI发布返回404,asp.net-mvc-4,asp.net-web-api,Asp.net Mvc 4,Asp.net Web Api,我看了很多类似的问题,但是找不到一个适合我的解决方案。因此,对Get的调用工作正常,但对POST的调用返回404。我创建了一个简单的WebAPI项目(MVC4) 我创建了另一个项目(ASP.Net),其中包含一个html文件,代码如下: <script src="Scripts/jquery-2.0.3.js"></script> <script src="Scripts/jquery-2.0.3.intellisense.js"></script>
<script src="Scripts/jquery-2.0.3.js"></script>
<script src="Scripts/jquery-2.0.3.intellisense.js"></script>
<script type="text/javascript">
function postData() {
$.post('http://localhost:34645/api/cases', { "CaseID": 3, "CaseCode": "three", "CaseDescription": "case three" }).done(function (data) { alert("Success " + data); }).fail(function (xhr, textStatus, errorThrown) { alert("Error " + xhr.status); });
}
</script>
WebAPIConfig.Register:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//RA: to get JSON
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
}
}
路线图:
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 }
);
}
}
请告知。如果这是两个独立的解决方案,请检查它们是否都在运行-它们可能试图共享一个服务器实例,因此当另一个应用程序运行时,您尝试使用的WebAPI没有运行。如果它们是同一解决方案中的项目,请检查它们是否都设置为在启动时运行,或者再次检查,当ASP.NET项目尝试访问WebAPI时,WebAPI将不会运行。请尝试下面的内容。它对我有用。为了简洁起见,我删除了一些属性
public class CasesController : ApiController {
// GET api/cases
public IEnumerable<Case> Get() {
var caseManager = new CaseManager();
return caseManager.ListCases();
}
// POST api/cases
[HttpPost]
public string Post([FromBody]Case objCase) {
return objCase.CaseName;
}
}
public interface ICaseManager {
IEnumerable<Case> ListCases();
}
public class CaseManager {
public IEnumerable<Case> ListCases()
{
return new List<Case>() { new Case() { CaseID = 1, CaseName = "one" } };
}
}
public class Case {
public int CaseID { get; set; }
public string CaseName { get; set; }
}
公共类案例控制器:ApiController{
//获取api/案例
公共IEnumerable Get(){
var caseManager=新caseManager();
返回caseManager.ListCases();
}
//后空气污染指数/个案
[HttpPost]
公共字符串Post([FromBody]Case objCase){
返回objCase.CaseName;
}
}
公共接口ICaseManager{
IEnumerable ListCases();
}
公共课个案经理{
公共IEnumerable ListCases()
{
返回new List(){new Case(){CaseID=1,CaseName=“one”};
}
}
公开课案例{
public int CaseID{get;set;}
公共字符串CaseName{get;set;}
}
查看
<script type="text/javascript">
//function postData() {
// $.post('http://localhost:58820/api/cases', { "CaseID": 3, "CaseCode": "three", "CaseDescription": "case three" })
// .done(function (data) { alert("Success " + data); }).fail(function (xhr, textStatus, errorThrown)
// { alert("Error " + xhr.status); });
//}
$(document).ready(function () {
$('#save-source').click(function (e) {
e.preventDefault();
var source = {
'ID': 0,
'CaseID': 3,
'CaseName': "three",
};
$.ajax({
type: "POST",
dataType: "json",
url: "/api/cases",
data: source,
success: function (data) {
alert(data);
},
error: function (error) {
jsonValue = jQuery.parseJSON(error.responseText);
}
});
});
});
</script>
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "myForm"}))
{
<input type="submit" id="save-source" name="save-source" value="Add" />
}
//函数postData(){
//$.post($)http://localhost:58820/api/cases“,{“案例ID”:3,“案例代码”:“三”,“案例描述”:“案例三”})
//.done(函数(数据){alert(“Success”+data);}).fail(函数(xhr,textStatus,errorshown)
//{警报(“错误”+xhr.status);});
//}
$(文档).ready(函数(){
$(“#保存源”)。单击(函数(e){
e、 预防默认值();
变量源={
“ID”:0,
“CaseID”:3,
'案例名称':“三个”,
};
$.ajax({
类型:“POST”,
数据类型:“json”,
url:“/api/cases”,
资料来源:,
成功:功能(数据){
警报(数据);
},
错误:函数(错误){
jsonValue=jQuery.parseJSON(error.responseText);
}
});
});
});
@使用(Html.BeginForm(null,null,FormMethod.Post,new{id=“myForm”}))
{
}
经过多次尝试,本文对我的帮助最大:
我还通过NuGet安装了Ninject WebApi DependencyResolver包。请注意WebApi注册行的顺序。我发现,当我专门使用Global.asax.cs代码时,它是这样工作的:
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
否则,它将失败,出现404错误。您编写了一个发布到
$.post('http://localhost:34645/api/cases“…
或者更改url以显式包含操作方法名称,例如:$.post('http://localhost:34645/api/cases/post“..
或者在config.Routes.MapHttpRoute中添加默认操作,当url中未指定任何操作时,将使用该操作
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action="Post", id = RouteParameter.Optional }
);
或者你可以改变你的路线去
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
);
(如果没有{action},那么当您使用Post http谓词时,web api将到达Post方法(它知道自动执行此操作,但如果您设置了默认操作,它将覆盖它)两者都在运行,并在解决方案中设置为启动。解决方案是一个,项目是分开的。有什么方法可以得到更详细的错误吗?ThxOk,这很奇怪:我在POST操作上放置了一个断点,它确实被调用了!objCase也正确填充了。奇怪的是,“失败”在postData函数中调用,而不是“完成”部分。我尝试返回HttpResponseMessage(已创建),但问题相同。谢谢,但我不确定这与$.post有何不同。无论如何,我尝试了此操作,但它仍然位于错误函数中。调试器显示post被正确调用。我放置了警报(error.responseText)以及警报(jsonValue)。前者未定义,而后者根本不发出警报。因此仍然存在相同的问题。你一定在做一些不同的事情。如果我只是将上述解决方案复制粘贴到全新的WebAPI hello world应用程序中,它就可以正常工作。我建议尝试完全按照我的方式实现,看看会发生什么。如果仍然存在问题,你可以开始删除任何其他解决方案可能会干扰的组件,看看是什么造成了差异。如果您仍然无法找到它。创建一个全新的WebAPI(随模板提供),并尝试首先在那里工作。我相信你离解决这个问题不远了。问题是:当我将html页面移动到与webapi相同的项目中,并给出了相对的引用/api/cases时,它工作得很好。但是当它是一个单独的ASP.Net项目时,我得到了我提到的错误。因此,是的,它越来越近了,但是感谢您的帮助。我想当您尝试从另一个asp.net项目调用ajax api时,可能会遇到跨浏览器访问问题。以下是如何解决该问题的帖子。好的,我需要的是JSONP。我安装了NuGet包WebApiContrib.Formatting.JSONP,并在global.asa中添加了JSONP格式化程序x、 因此,即使是$.post现在也在使用数据类型jsonp。感谢您的支持。这没有多大意义。为什么您要跨域执行此操作?对我来说就是这样。而且WebApiConfig.Register(GlobalConfiguration.Configuration)和GlobalConfiguration.Configure(WebApiConfig.Register)之间似乎没有什么区别.但秩序在这里很重要。
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { action="Post", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
);