Web API控制器“发现多个操作”

时间:2015-09-05 05:37:27

标签: asp.net asp.net-web-api2

我正在使用以下获取请求来查询以下Web API控制器,

/ api / records?aasdfsdf - 返回记录中的所有内容

/ api / records?search = aasdfsdf - 引发以下错误:

  

“找到了与请求匹配的多个操作:\ r \ nGetRecords

有人能够解释可能是什么原因吗?

  public IQueryable<Record> GetRecord()
    {
       // return db.Records;
    }


    public IQueryable<Record> GetRecord(String search)
    {
        // return db.Record;
    }

    public IQueryable<Ecg> GetEcgs(String search,DateRange date)
    {
         // return db.Record;
    }

    public class DateRange
    {
        public DateTime start { get; set; }
        public DateTime end { get; set; }
    }

还有什么是正确的查询方式:

  

public IQueryable GetEcgs(String search,DateRange date)

我尝试过以下操作但是我得到了相同的“多重操作”错误。任何帮助将不胜感激。

  

/api/records?search=asdfsdf?start=2014-09-05%2014:02:17.757&end=2014-09-05%2014:02:17.757

1 个答案:

答案 0 :(得分:0)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
<link href="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css" rel="stylesheet"/>
<div class="btn-group">
  <button type="button" class="dropdown-toggle" data-toggle="dropdown">
    Search <span class="caret"></span>
  </button>
  <div class="col-sm-12 dropdown-menu">
    <select class="form-control" >
      <option value="id">ID</option>
      <option value="Name">Name</option>
    </select>
    <input type="text" class="form-control" />
    <button>Reset</button>
    <button id="search-btn" class="pull-right">Go</button>
  </div>
</div>

此请求将路由到GetRecord()方法,因为您的查询字符串没有任何键值对,因此唯一可能的路由是GetRecord()

/api/records?aasdfsdf

此请求可以路由到GetRecord(字符串搜索)和GetEcgs(字符串搜索,DateRange日期),日期为null。这就是你有例外的原因。

您可以将控制器更改为以下内容以获取所需的路由:

/api/records?search=aasdfsdf 

如果Ecg和Record都是相同的基类,则可以返回IQueryable&lt; BaseClass&gt;而不仅仅是对象。在我们的web api项目中,我们不使用控制器返回两种不同的类型,或者我们使用IHttpActionResult:

public IQueryable<Record> GetRecord()
{
   // return db.Records;
}

public object GetRecord(String search, DateTime? start, DateTime? end)
{
    if( start.HasValue && end.HasValue )
    {
        return this.GetEcgs(search, new DateRange(start,end));
    }

    return this.GetRecord(search);
}

//use private so it's not a possible route or use [NonAction]
private IQueryable<Record> GetRecord(String search)
{
    // return db.Record;
}

private IQueryable<Ecg> GetEcgs(String search, DateRange date)
{
     // return db.Record;
}

这比返回“对象”要好得多,但如果您有自定义过滤器将在控制器之后运行,那么您将需要返回对象而不是结果,因此您的使用会有所不同。