WebApi多动作路由不适用于基于AngularJs属性的路由
我试图让以下代码路由到自托管WebApi控制器ResourcesController上的操作,但路由不会路由到Delete方法以及GetAllResources方法。它只适用于一种方法,但不能同时适用于两种方法。我使用基于属性的路由。乐意接受任何帮助 使用以下Web Api自托管启动代码: 使用域实体; 使用Owin; 使用WebApiContrib.Formatting.Jsonp 命名空间ResourcesWebHost { 公营创业 { 公共void配置AppBuilder应用程序 { var webApiConfiguration=ConfigureWebApi; app.UseWebApiwebApiConfiguration; }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
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代码无关