2014-04-29 3 views
0

Я только начинаю использовать веб-контроллеры API2 и, с некоторыми трудностями. Я использую также маршрутизацию атрибутовНет Получить метод в web-контроллере api2

ОБНОВЛЕНО: My Controller настроен следующим образом;

Namespace TraderProductData 
<RoutePrefix("api/symbols")> 
Public Class SymbolsController 
    Inherits ApiController 

    Private db As New SymbolsEntities 
    'GET api/Symbols 
    <HttpGet> _ 
    Function Getsymbols() As IQueryable(Of symbol) 
     Return db.symbols 
    End Function 
    'GET api/Symbols/20 ....20 is for equities, so get equity symbols 
    <HttpGet> _ 
    <Route("{symbolType}", Name:="getsymbolsfortype")> _ 
    Function GetSymbolsForType(ByVal symbolType As Integer) As IQueryable(Of symbol) 
     Dim symbols As IQueryable(Of symbol) = From d In db.symbols 
               Where d.SymbolType = symbolType 
               Select d 

     Return symbols 
    End Function 
    'GET api/symbols/SymbolExistsId/1922 
    <HttpGet> _ 
    <Route("SymbolExistsId/{id}", Name:="symbolexistsid")> _ 
    Function SymbolExistsId(ByVal id As Integer) As Boolean 
     Return db.symbols.Count(Function(e) e.Id = id) > 0 
    End Function 
    'GET api/symbols/SymbolExists/AAPL 
    <HttpGet> _ 
    <Route("SymbolExists/{symbol}", Name:="symbolexistssymbol")> _ 
    Function SymbolExists(ByVal symbol As String) As Boolean 
     Return db.symbols.Count(Function(e) e.Symbol1 = symbol) > 0 
    End Function 
    'GET api/symbols/GetNameIfSymbolExists/AAPL 
    <HttpGet> _ 
    <Route("GetNameIfSymbolExists/{symbol}", Name:="getnameifsymbolexists")> _ 
    Function GetNameIfSymbolExists(ByVal symbol As String) As String 
     Dim symbolName As String = (From d In db.symbols 
            Where d.Symbol1 = symbol 
            Select d.Name).FirstOrDefault() 
     Return symbolName 
    End Function 
    'GET api/symbols/GetNameIfSymbolIdExists/1922 
    <HttpGet> _ 
    <Route("GetNameIfSymbolIdExists/{id}", Name:="getnameifsymbolidexists")> _ 
    Function GetNameIfSymbolIdExists(ByVal id As Integer) As String 
     Dim symbolName As String = (From d In db.symbols 
            Where d.Id = id 
            Select d.Name).FirstOrDefault() 
     Return symbolName 
    End Function 
    'GET api/symbols/GetSymbolIdIfSymbolExists/AAPL 
    <HttpGet> _ 
    <Route("GetSymbolIdIfSymbolExists/{symbol}", Name:="getsymbolidifsymbolexists")> _ 
    Function GetSymbolIdIfSymbolExists(ByVal symbol As String) As Integer 
     Dim symbolId As Integer = (From d In db.symbols Where d.Symbol1 = symbol Select d.Id).FirstOrDefault() 
     Return symbolId 
    End Function 

    <HttpGet> _ 
    <Route("GetSymbolById/{id}", Name:="getsymbolbyid")> _ 
    <ResponseType(GetType(symbol))> _ 
    Async Function GetSymbolById(ByVal id As Integer) As Task(Of IHttpActionResult) 
     Dim symbol As symbol = Await db.symbols.FindAsync(id) 
     If IsNothing(symbol) Then 
      Return NotFound() 
     End If 

     Return Ok(symbol) 
    End Function 

    ' POST api/Symbols 
    <HttpPost> _ 
    <Route("{symbol}", Name:="postsymbol")> _ 
    <ResponseType(GetType(symbol))> _ 
    Async Function Postsymbol(ByVal symbol As symbol) As Task(Of IHttpActionResult) 
     If Not ModelState.IsValid Then 
      Return BadRequest(ModelState) 
     End If 

     db.symbols.Add(symbol) 
     Await db.SaveChangesAsync() 

     Return CreatedAtRoute("DefaultApi", New With {.id = symbol.Id}, symbol) 
    End Function 



    Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
     If (disposing) Then 
      db.Dispose() 
     End If 
     MyBase.Dispose(disposing) 
    End Sub 
End Class 
End Namespace 

выше теперь работает, как ожидалось

ответ

1

Вы действительно хотите добавить <HttpGet> к SymbolExists методу , а как добавление к методу GetSymbols.

Причина в том, что ваш GetSymbols() работает, потому что ваш <RoutePrefix> и имя контроллера соответствуют глобальному маршруту. Вы не должны полагаться на это, поскольку он хрупкий и неожиданно сломает вас.

Правило большого пальца здесь: Если у вас есть много ваших действий, AttributeRouted делает все это так. Вероятно, можно использовать AttributeRoute для замены URL-адреса для одного или двух действий на вашем контроллере.

+0

Я дал ответ Джейсону, потому что он ответил сначала, но я поддержал вас. Любая подсказка, почему я получаю ошибку распознавателя ограничений, если я пытаюсь добавить ограничение к параметру? Таким образом _ – dinotom

+1

1. Нет такого ограничения, которое называется string, посмотрите в этой ссылке на доступные ограничения: http: // www. asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 Также обратите внимание, что, хотя ответ Джейсона будет работать, вы должны действительно внести полный изменения I «Предлагаю. В противном случае вы остаетесь в хрупком состоянии. В качестве альтернативы рассмотрим –

+0

. Я получаю ту же ошибку при использовании {id: integer}, которая должна быть действительной для vb.net или {id: int} для C# – dinotom

0

Вам не нужны другие маршруты. Имя вашей функции - это дочерний маршрут. Вы должны заменить его HttpGet или HttpPost или HttpPut и т.д ..

Try:

<HttpGet> 
Function SymbolExists(ByVal symbol As String) As Boolean 
    Return db.symbols.Count(Function(e) e.Symbol1 = symbol) > 0 
End Function 

 Смежные вопросы

  • Нет связанных вопросов^_^