Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net web api 即使没有ODATA,默认API路由也无法工作_Asp.net Web Api_Odata_Asp.net Web Api Routing - Fatal编程技术网

Asp.net web api 即使没有ODATA,默认API路由也无法工作

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

调用/api/something/67545217-0fed-4058-9cfc-f6363412f5a2时遇到问题。它称之为“通吃”。另一个Get的工作,但我认为这是因为他们在url中使用了{action}。我正在使用[ActionName]装饰器

以下是我的路线:

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()