WebApi多动作路由不适用于基于AngularJs属性的路由

WebApi多动作路由不适用于基于AngularJs属性的路由,angularjs,asp.net-web-api,asp.net-mvc-routing,Angularjs,Asp.net Web Api,Asp.net Mvc Routing,我试图让以下代码路由到自托管WebApi控制器ResourcesController上的操作,但路由不会路由到Delete方法以及GetAllResources方法。它只适用于一种方法,但不能同时适用于两种方法。我使用基于属性的路由。乐意接受任何帮助 使用以下Web Api自托管启动代码: 使用域实体; 使用Owin; 使用WebApiContrib.Formatting.Jsonp 命名空间ResourcesWebHost { 公营创业 { 公共void配置AppBuilder应用程序 { v

我试图让以下代码路由到自托管WebApi控制器ResourcesController上的操作,但路由不会路由到Delete方法以及GetAllResources方法。它只适用于一种方法,但不能同时适用于两种方法。我使用基于属性的路由。乐意接受任何帮助

使用以下Web Api自托管启动代码:

使用域实体; 使用Owin; 使用WebApiContrib.Formatting.Jsonp

命名空间ResourcesWebHost { 公营创业 { 公共void配置AppBuilder应用程序 { var webApiConfiguration=ConfigureWebApi; app.UseWebApiwebApiConfiguration; }

    private HttpConfiguration ConfigureWebApi()
    {
        var config = new HttpConfiguration();
        var corsAttr = new EnableCorsAttribute("http://localhost:5000/", "*", "*");
        config.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter()));
        config.EnableCors();
        config.Filters.Add(new CrossDomainAccessFilter());
        config.MapHttpAttributeRoutes();
        return config;
    }

    public class CrossDomainAccessFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var routes = actionContext.Request.GetRouteData();
            base.OnActionExecuting(actionContext);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Response.Content != null)
            {
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Origin", "null");
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Headers","Content-Type, X-Requested-With");
            }
        }
    }
}
}

    private HttpConfiguration ConfigureWebApi()
    {
        var config = new HttpConfiguration();
        var corsAttr = new EnableCorsAttribute("http://localhost:5000/", "*", "*");
        config.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter()));
        config.EnableCors();
        config.Filters.Add(new CrossDomainAccessFilter());
        config.MapHttpAttributeRoutes();
        return config;
    }

    public class CrossDomainAccessFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var routes = actionContext.Request.GetRouteData();
            base.OnActionExecuting(actionContext);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Response.Content != null)
            {
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Origin", "null");
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Headers","Content-Type, X-Requested-With");
            }
        }
    }
}
使用以下控制器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;
using DomainEntities;
using Interfaces;
using ResourceManagerService;

namespace ResourcesWebApiHost
{


public class ResourcesController : ApiController
{
    [Route("api/Resources/GetAllResources")]
    [HttpGet]
    public List<Resource> GetAllResources()
    {
        var service = new Service();
        return service.GetAllResources();
    }

    [ActionName("api/Resources/Delete")]
    [HttpPost]
    public HttpResponseMessage Delete(List<Resource> resources)
    {
        var service = new Service();
        var success = service.Delete(resources);
        var result = Request.CreateResponse(HttpStatusCode.OK,                  success.ToString());
        return result;
    }
}
}

    private HttpConfiguration ConfigureWebApi()
    {
        var config = new HttpConfiguration();
        var corsAttr = new EnableCorsAttribute("http://localhost:5000/", "*", "*");
        config.Formatters.Insert(0, new JsonpMediaTypeFormatter(new JsonMediaTypeFormatter()));
        config.EnableCors();
        config.Filters.Add(new CrossDomainAccessFilter());
        config.MapHttpAttributeRoutes();
        return config;
    }

    public class CrossDomainAccessFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var routes = actionContext.Request.GetRouteData();
            base.OnActionExecuting(actionContext);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Response.Content != null)
            {
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Origin", "null");
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
                actionExecutedContext.Response.Content.Headers.Add("Access-Control-Allow-Headers","Content-Type, X-Requested-With");
            }
        }
    }
}
使用以下AngularJs代码:

var-appUrl=; var模型={}

    var resourcesApp = angular.module("resourcesApp", []);

    resourcesApp.run(function ($http) {
        $http.defaults.headers.put = {
            'Access-Control-Allow-Origin': '*',
            'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
            'Access-Control-Allow-Headers': 'Content-Type, X-Requested-With'
        };
        $http.defaults.useXDomain = true;

        $http.get('http://localhost:5001/api/Resources/GetAllResources').success(function (data) {
            model.resources = data;
        }).error(function (data, status) {
            alert('ERROR ' + (data || 'No Error Description'));
        });
    });

    resourcesApp.filter("selectedItems", function () {
        return function (items) {
            var resultArr = [];
            angular.forEach(items, function (item) {
                if (item.mustDelete == true) {
                    resultArr.push(item);
                }
            });
            return resultArr;
        }
    });

    resourcesApp.controller("resourcesCtrl", function ($scope, $http) {
        $scope.theModel = model;
        $scope.close = function () {
            window.close();
        }
        $scope.deleteSelectedItems = function () {
            $http.defaults.useXDomain = true;
            $http.post('http://localhost:5001/api/Resources/Delete', $scope.theModel.resources);
        }
    });
</script>

通过向我的控制器类添加[EnableCorsorigins:,headers:,methods:]头,问题得以解决。新代码如下所示:

namespace ResourcesWebApiHost
{
    [EnableCors(origins: "*", headers: "*", methods: "*")]
    public class ResourcesController : ApiController
    {//...more code follows...
我用于跨源请求,但我只实现了配置部分——我忽略了向类添加属性,这就完成了enable CORS实现

关于更多信息,此问题与ASP.NETWebAPI路由系统有关,与AngularJS代码无关