Почему один метод веб-API работает, а другой нет?

Один из моих методов веб-API работает отлично, а другой — совсем нет.

Под отлично работает я подразумеваю вот это:

введите здесь описание изображения

Другой, однако, кажется, даже не знает о себе. Он отвечает на запрос браузера:

введите здесь описание изображения

Код, кажется, настроен одинаково для них обоих, поэтому я не знаю, почему один работает как шарм, а другой так туго.

Соответствующий код:

КОНТРОЛЛЕР

public class DepartmentsController : ApiController
{
    private readonly IDepartmentRepository _deptsRepository;

    public DepartmentsController(IDepartmentRepository deptsRepository)
    {
        if (deptsRepository == null)
        {
            throw new ArgumentNullException("deptsRepository is null");
        }
        _deptsRepository = deptsRepository;
    }

    [Route("api/Departments/Count")]
    public int GetCountOfDepartmentRecords()
    {
        return _deptsRepository.Get();
    }

    [Route("api/Departments")]
    public IEnumerable<Department> GetBatchOfDepartmentsByStartingID(int ID, int CountToFetch)
    {
        return _deptsRepository.Get(ID, CountToFetch);
    }

РЕПОЗИТОРИЙ

public class DepartmentRepository : IDepartmentRepository
{
    private readonly List<Department> departments = new List<Department>();

    public DepartmentRepository()
    {
        using (var conn = new OleDbConnection(
            @"Provider=Microsoft.ACE.OLEDB.12.0;User ID=Freebo;Password=RunningOnEmpty;Data Source=C:\CDBWin\DATA\CCRDAT42.MDB;Jet OLEDB:System database=C:\CDBWin\Data\nrbq.mdw"))
        {
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT td_department_accounts.dept_no, IIF(ISNULL(t_accounts.name),'No Name provided',t_accounts.name) AS name FROM t_accounts INNER JOIN td_department_accounts ON t_accounts.account_no = td_department_accounts.account_no ORDER BY td_department_accounts.dept_no";
                cmd.CommandType = CommandType.Text;
                conn.Open();
                int i = 1;
                using (OleDbDataReader oleDbD8aReader = cmd.ExecuteReader())
                {
                    while (oleDbD8aReader != null && oleDbD8aReader.Read())
                    {
                        int deptNum = oleDbD8aReader.GetInt16(0);
                        string deptName = oleDbD8aReader.GetString(1);
                        Add(new Department { Id = i, AccountId = deptNum, Name = deptName });
                        i++;
                    }
                }
            }
        }
    }

    public int Get()
    {
        return departments.Count;
    }

    private Department Get(int ID) // called by Delete()
    {
        return departments.First(d => d.Id == ID);
    }

Если ввести:

http://shannon2:28642/api/Departments/Count 

в браузере работает для выполнения метода контроллера GetCountOfDepartmentRecords(), почему ввод:

 http://localhost:28642/api/Departments/5/6

(or:

 http://localhost:28642/api/Departments/1/5

и т. д.) не работает для выполнения метода контроллера GetBatchOfDepartmentsByStartingID()?


person B. Clay Shannon    schedule 15.01.2014    source источник


Ответы (2)


В вашем маршруте отсутствуют параметры.

[Route("api/Departments/{ID:int}/{CountToFetch:int}")]
person danludwig    schedule 15.01.2014

Этот вопрос похож на ваш другой вопрос ниже:

Почему мой вызов веб-API возвращается На контроллере 'DPlatypus' не найдено действие, соответствующее запросу?

Если вы ожидаете, что значения будут поступать из части URL-адреса, не относящейся к строке запроса, вам необходимо определить их в шаблоне маршрута. Итак, это должно быть

[Route("api/Departments/{id}/{countToFetch}")]

Ниже приведена хорошая статья о маршрутизации и выборе действий в Web API:
http://www.asp.net/web-api/overview/web-api-routing-and-actions

person Kiran Challa    schedule 15.01.2014
comment
Спасибо; Может быть, я и говорил это раньше*, но если бы не плохая память, у меня бы вообще не было памяти (*точно не помню). - person B. Clay Shannon; 16.01.2014