在ASP中自定义GET操作.. NET WebAPI 2.0数据控制器



我使用WebApi2和OData。我想添加自定义动作,并使用它的GET方法

GET /odata/Providers(2)/DoSth

但是我不明白它到底是怎么工作的。下面是我的一个控制器的代码:

public class ProvidersController : ODataController
{
    private Entities db = new Entities();
    // GET: odata/Providers
    [Queryable]
    public IQueryable<PROVIDER> GetProviders()
    {
        return db.PROVIDER;
    }
    //... OTHER GENERATED METHODS
    //MY TEST METHOD SHOULD BE inoked: GET /odata/Providers(2)/DoSth
    public int DoSth()
    {
        return 22;
    }
 }

和WebApiConfigFile:

  ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
  builder.EntitySet<PROVIDER>("Providers").EntityType.HasKey(o => o.P_ID);
  //others entities ...
  //my custom action without any parameters, returns int:
  ActionConfiguration getTest = builder.Entity<PROVIDER>().Action("DoSth");
  getTest.Returns<int>();

/odata/$metadata中存在的方法

但是不能从url运行此方法(仍然显示404:"没有找到与请求URI匹配的HTTP资源")。

有什么办法可以改善这个问题吗?

在OData中,操作只能由POST方法调用。因此,只需将请求从GET更改为POST。

如果它不起作用,在控制器的方法中添加一个属性:

[HttpPost]
public int DoSth()
{
    return 22;
}

如果您刚开始使用OData,我建议您从OData V4开始,它是OASIS标准。下面是一个关于动作的示例:https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataActionsSample/。

我用另一种方法解决了这个问题…我不是一个深入的程序员,只是一个中级…然而,当问题出现时,我确实会以任何可能的方式解决……

我需要一个标准$filter功能无法处理的搜索功能,我需要返回一个IQueryable,就像任何OData 4控制器一样(不包括get函数)。

首先在我适当的控制器…我采用了与Get"Entity"调用完全相同的签名,并添加了一个参数。

    [EnableQuery]
    public IQueryable<detail> Getdetails([FromODataUri] int key)
    {
        return db.masters.Where(m => m.masterid == key).SelectMany(m => m.details);
    }
    // custom function goes here...
    [EnableQuery]
    public IQueryable<detail> GetSearchDetails([FromODataUri] int key, [FromODataUri] IEnumerable<int> search)
    {
       1) do your own function logic here... mine happens to be a very complex search...
       2) make sure to return iQueryable as result... I use standard linq queries and then the final return is toList() as IQueryable
       3) I also did a simple return search.Count = 0 ? return all results : return queried results.
    }

在WebAPi配置中,这是签名;

1)第一行表示将代码放置在主控控制器中。2)第二行告诉我如何调用函数。第三行告诉我返回什么。4)第四行告诉我如何调用参数以及它是什么类型…5)第五行非常重要,如果你想避免不得不调用"://…/namspace .function(param='value')"。这将删除带点的名称空间约束。看到这个

:
builder.EntityType<master>()
            .Function("GetSearchDetails")
            .ReturnsCollectionFromEntitySet<detail>("details")
            .CollectionParameter<int>("search");
config.EnableUnqualifiedNameCall(unqualifiedNameCall: true);

这种方法解决了我在客户端遇到的许多问题…现在,我可以调用h!!p://domain/odata/master(n)/GetSearchDetails(search=[2,10,31])或者如果它是字符串数组h!!p://domain/odata/master(n)/GetSearchDetails(search=['two','ten','thirtyone']),它返回一个IQueryable就像调用底层实体一样…然而,额外的好处是,所有标准的OData v4功能仍然存在,$filter, $select…等等……

最新更新