Web API 路由配置未由具有多个参数的 angularjs 触发

Web API Route config not firing by angularjs with multiple parameters

请检查我的 WebApiConfig、API 控制器和 angular 服务。第一条路线工作正常,但第二条和第三条路线未通过 angularjs 调用。虽然 web api 路由没问题。

--WebApiConfig

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

        config.Formatters.Remove(config.Formatters.XmlFormatter);

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{param}",
            defaults: new { param = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "Api2",
            routeTemplate: "api/{controller}/{action}/{param1}/{param2}",
            defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional }
        );
        config.Routes.MapHttpRoute(
            name: "Api3",
            routeTemplate: "api/{controller}/{action}/{param1}/{param2}/{param3}",
            defaults: new { param1 = RouteParameter.Optional, param2 = RouteParameter.Optional, param3 = RouteParameter.Optional }
        );
    }
}

--网络API控制器

[HttpPost]
public IHttpActionResult InsertAcademicInfo(AcademicInformation[] param1, AcademicResult[] param2)
{
     return Ok(_academic.InsertAcademicInformation(param1, param2).Data);
}

--Angular服务

mainApp.factory('AcademicServices', ['$http', '$rootScope', function ($http, $rootScope) {
  return {
    Save: function (academic, results) {
        return $http({
            url: '/Api/ApiAcademic/InsertAcademicInfo',
            method: 'POST',
            data: { param1: academic, param2: results },
            async: false
        });
    },
  };
}]);

这不是 post 在 Web API 中的工作方式。您发送的内容与您期望的不符。如果你想通过消息体发送数据,你需要发送一个对象,这个对象可能很复杂。这是您当前通过 angular/javascript 调用所做的,而不是您在 Web api 方法中所期望的。像下面这样更改您的网站 api 以完成此操作。

此外,您确实应该使用路由属性,而不是尝试创建一个单一的路由 table 来容纳所有控制器中的所有路由。使用 RouteAttributeRoutePrefixAttribute。此外,您不需要在下面的方法中使用任何参数,因为您是使用请求消息正文而不是 URI 发送数据。

AcademicInfoModel.cs

public class AcademicInfoModel {
    public AcademicInformation[] param1 {get;set;}
    public AcademicResult[] param2 {get;set;}
}

ApiAcademicController.cs

[RoutePrefix("api/ApiAcademic")]
public class ApiAcademicController : ApiController
{

    [HttpPost]
    [Route("InsertAcademicInfo")]
    public IHttpActionResult InsertAcademicInfo(AcademicInfoModel model)
    {
         return Ok(_academic.InsertAcademicInformation(model.param1, model.param2).Data);
    }
}