Asp.net mvc 4 ASP.NETMVC4WebAPI发布返回404

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>

我看了很多类似的问题,但是找不到一个适合我的解决方案。因此,对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 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}",               
            );