繁体   English   中英

ASP.Net WebAPI 2 404错误-见解不同

[英]ASP.Net WebAPI 2 404 Error - Insights Say Different

我知道这个问题已经问过好几次了,我看了很多问题,但是到目前为止,没有一个答案对我有用。

我正在使用使用.Net 4.5.2的ASP.Net WebAPI 2控制器,并使用Ajax进行发布。

我立即收到一个404错误,但是查看的见解表明,对该控制器和该action \\ method的请求数量为x,但立即返回404。

这是方法,如果有人可以帮助我,将不胜感激。

 [System.Web.Mvc.HttpPost()]

 public int InsertRecord(Models.Person model)
    {

        if (ModelState.IsValid)
        {
            var person = new Person
            {
                FirstName = model.FirstName,
                LastName = model.LastName,
                DateOfBirth = Convert.ToDateTime(model.DateOfBirth)
            };

            _dbContext.People.Add(person);
            _dbContext.SaveChanges();

            var id = person.P_id;

            return id;
        }
        else
        {
            throw new Exception("Invalid Data", null);
        }
    }

从我的Ajax调用如下:

 $("#btnSave").click(function () {

    $('#FirstName').valid();
    $('#LastName').valid();
    $('#DateOfBirth').valid();

    if ($('#FirstName').valid() &&
        $('#LastName').valid() &&
        $('#DateOfBirth').valid()) {
        //console.log("save clicked");
        var jsonData = {
            firstName: $('#FirstName').val(),
            lastName: $('#LastName').val(),
            dateofBirth: $('#DateOfBirth').val()
        }

        $.ajax(
            {
                type: "POST", //HTTP POST Method  
                url: "http://localhost:56658/AddPerson/InsertRecord", // Controller/View   
                data: jsonData,
                success: function (response) {
                    if (response != null && response.success) {
                        alert(response.responseText);
                    } else {
                        // DoSomethingElse()
                        alert(response.responseText);
                    }
                },
                error: function (response) {
                    alert("error!");  // 
                    console.log(response);
                }

            });
        return false;
    }



});

编辑

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

        routes.MapRoute(
            name: "AddPerson",
            url: "{controller}/{action}",
            defaults: new { controller = "AddPerson", action = "InsertRecord"}
        );
    }
}

编辑2

这是全局asax文件的内容

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

    }

编辑3

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

由于这是一个Wep API,因此应尝试遵循该设计意图

检查WebApiConfic通常在哪里

public static class WebApiConfig {
    public static void Register(HttpConfiguration config) {
        // Attribute routing.
        config.MapHttpAttributeRoutes();

        // Convention-based routing.
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

请注意默认路由的api前缀。 这配置了如何调用Web API端点。 api前缀是为了避免与常规MVC框架发生路由冲突。

网址看起来像api/AddPerson

接下来,请确保控制器创建正确并遵循建议的设计。 尽量避免给控制器增加太多责任。 控制器是UI的关注点,应尽可能地精简。

public interface IAddPersonCommand {
    int? InsertRecord(Models.Person model model);
}

public class PersonController : ApiController {
    private readonly IAddPersonCommand service;
    public PersonController(IAddPersonCommand service) {
        this.service = service;
    }

    [HttpPost]
    public IHttpActionResult Post([FromBody]Models.Person model) {    
        if (ModelState.IsValid) {
            var id = service.InsertRecord(model);
            if(id !=null) {
                return Ok(id);
            }
        } 
        //If we get this far bad request
        return BadRequest();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM