Asp.net web api 即使没有ODATA,默认API路由也无法工作
调用/api/something/67545217-0fed-4058-9cfc-f6363412f5a2时遇到问题。它称之为“通吃”。另一个Get的工作,但我认为这是因为他们在url中使用了{action}。我正在使用[ActionName]装饰器 以下是我的路线:Asp.net web api 即使没有ODATA,默认API路由也无法工作,asp.net-web-api,odata,asp.net-web-api-routing,Asp.net Web Api,Odata,Asp.net Web Api Routing,调用/api/something/67545217-0fed-4058-9cfc-f6363412f5a2时遇到问题。它称之为“通吃”。另一个Get的工作,但我认为这是因为他们在url中使用了{action}。我正在使用[ActionName]装饰器 以下是我的路线: public static void Register(HttpConfiguration config) { // enable CORS config.EnableCors();
public static void Register(HttpConfiguration config)
{
// enable CORS
config.EnableCors();
config.Services.Replace(typeof(IHttpControllerSelector), new ControllerSelector(config));
// enable OData Queries
// http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options
config.EnableQuerySupport();
// http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions
var builder = new ODataConventionModelBuilder();
builder.EntitySet<Survey>("Survey");
config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{actionuniqueid}",
new
{
actionuniqueid =
@"^[A-Fa-f0-9]{32}$|({|\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$"
});
// Match All Regular Get Calls
config.Routes.MapHttpRoute("DefaultController", "api/{controller}");
config.Routes.MapHttpRoute(
"DefaultApiActionId",
"api/{controller}/{action}/{actionuniqueid}",
null,
new
{
action = @"^[a-zA-Z]+([\s][a-zA-Z]+)*$",
actionuniqueid =
@"^[A-Fa-f0-9]{32}$|({|\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$"
});
config.Routes.MapHttpRoute(
"DefaultApiTwoActionId",
"api/{controller}/{action}/{actionuniqueid}/{actionsecondaryid}",
null,
new
{
action = @"^[a-zA-Z]+([\s][a-zA-Z]+)*$",
actionuniqueid =
@"^[A-Fa-f0-9]{32}$|({|\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$",
actionsecondaryid =
@"^[A-Fa-f0-9]{32}$|({|\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$"
});
}
公共静态无效寄存器(HttpConfiguration配置)
{
//启用CORS
config.EnableCors();
配置服务替换(类型为(IHttpControllerSelector),新的ControllerSelector(配置));
//启用OData查询
// http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options
config.EnableQuerySupport();
// http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions
var builder=新的ODataConventionModelBuilder();
建造商实体集(“调查”);
config.Routes.MapODataRoute(“odata”,“odata”,builder.GetEdmModel());
//Web API路由
config.maphttpAttribute路由();
config.Routes.MapHttpRoute(
“DefaultApi”,
“api/{controller}/{actionuniqueid}”,
新的
{
唯一动作=
@[A-Fa-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-9{4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7{7}[0xA-Fa-f0-9]{3,4}(}}})$”
});
//匹配所有常规Get呼叫
MapHttpRoute(“DefaultController”,“api/{controller}”);
config.Routes.MapHttpRoute(
“DefaultApiActionId”,
“api/{controller}/{action}/{actionuniqueid}”,
无效的
新的
{
action=@“^[a-zA-Z]+([\s][a-zA-Z]+)*$”,
唯一动作=
@[A-Fa-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-9{4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7{7}[0xA-Fa-f0-9]{3,4}(}}})$”
});
config.Routes.MapHttpRoute(
“DefaultApiTwoActionId”,
“api/{controller}/{action}/{actionuniqueid}/{actionsecondaryid}”,
无效的
新的
{
action=@“^[a-zA-Z]+([\s][a-zA-Z]+)*$”,
唯一动作=
@[A-Fa-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-9{4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7{7}[0xA-Fa-f0-9]{3,4}(}}})$“,
actionsecondaryid=
@[A-Fa-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-F-9{4 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7{7}[0xA-Fa-f0-9]{3,4}(}}})$”
});
}
这是我所有的得到…当我调用控制器时,只有ID…没有调用正确的路径。是因为它的设置与“按类型”相同吗
public class TestController : ApiController
{
[Queryable]
[ResponseType(typeof(Test))]
public IQueryable<Test> Get(ODataQueryOptions opts)
{
IEnumerable<Test> test= (new Test()).PullList<Test>(LoadDepth.Self, "ByAll");
IQueryable results = test.AsQueryable();
return opts.ApplyTo(results) as IQueryable<Test>;
}
[HttpGet]
[Queryable]
[ActionName("ById")]
[ResponseType(typeof(Test))]
public IQueryable<Test> Get(ODataQueryOptions opts, Guid actionuniqueid)
{
IEnumerable<Test> test = (new Test()).PullList<Survey>(
LoadDepth.Everything,
"ById",
actionuniqueid);
IQueryable results = test.AsQueryable();
return opts.ApplyTo(results) as IQueryable<Test>;
}
[HttpGet]
[ActionName("ByType")]
[ResponseType(typeof(Test))]
public IQueryable<Test> GetByType(ODataQueryOptions opts, Guid actionuniqueid)
{
IEnumerable<Test> survey = (new Test()).PullList<Survey>(
LoadDepth.Everything,
"ByType",
actionuniqueid);
IQueryable results = test.AsQueryable();
return opts.ApplyTo(results) as IQueryable<Test>;
}
公共类TestController:ApiController
{
[可查询]
[响应类型(类型(测试))]
公共IQueryable获取(ODataQueryOptions选项)
{
IEnumerable test=(new test()).PullList(LoadDepth.Self,“ByAll”);
IQueryable结果=test.AsQueryable();
返回选项ApplyTo(结果)作为可液化;
}
[HttpGet]
[可查询]
[动作名称(“ById”)]
[响应类型(类型(测试))]
公共IQueryable Get(ODataQueryOptions选项,Guid actionuniqueid)
{
IEnumerable test=(new test()).PullList(
装载深度,一切,
“ById”,
唯一性);
IQueryable结果=test.AsQueryable();
返回选项ApplyTo(结果)作为可液化;
}
[HttpGet]
[操作名称(“按类型”)]
[响应类型(类型(测试))]
公共IQueryable GetByType(ODataQueryOptions选项,Guid actionuniqueid)
{
IEnumerable survey=(新测试()).PullList(
装载深度,一切,
“按类型”,
唯一性);
IQueryable结果=test.AsQueryable();
返回选项ApplyTo(结果)作为可液化;
}
为odata安装nuget软件包
在“WebApiConfig.cs”文件中添加以下代码
我只需执行以下操作,添加了操作路线:
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{actionuniqueid}",
new
{
actionuniqueid =
@"^[A-Fa-f0-9]{32}$|({|\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$",
Action = "ById"
});
不确定您是否仍然使用v3或已升级到v4,但如果您仍然使用Web API
config.MapHttpAttributeRoutes()
需要在Odata路由之前我已经在做所有这些事情了。只有一个“Get”不起作用。如上所述,我添加了更多代码。这是因为ByType和ByID具有相同的参数吗?在不使用时,我如何路由到ByID。使用Odata路由约定。请参考这一个“”
public class TestOdataController : OdataController
{
//GET odata/TestOdata
public IQueryable<ViewTest> Get()
{
try
{
return context.View_TestRepository.GetQueryable();
}
catch (Exception ex)
{
throw ex;
}
}
}
"http://localhost:8080/odata/TestOdata"
config.Routes.MapHttpRoute(
"DefaultApi",
"api/{controller}/{actionuniqueid}",
new
{
actionuniqueid =
@"^[A-Fa-f0-9]{32}$|({|\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$",
Action = "ById"
});
config.MapHttpAttributeRoutes()