Na Web API, eu tinha uma classe de estrutura semelhante:
public class SomeController : ApiController
{
[WebGet(UriTemplate = "{itemSource}/Items")]
public SomeValue GetItems(CustomParam parameter) { ... }
[WebGet(UriTemplate = "{itemSource}/Items/{parent}")]
public SomeValue GetChildItems(CustomParam parameter, SomeObject parent) { ... }
}
Como conseguimos mapear métodos individuais, era muito simples obter a solicitação certa no lugar certo. Para uma classe semelhante que tinha apenas um GET
método, mas também um Object
parâmetro, usei com sucesso IActionValueBinder
. No entanto, no caso descrito acima, recebo o seguinte erro:
Multiple actions were found that match the request:
SomeValue GetItems(CustomParam parameter) on type SomeType
SomeValue GetChildItems(CustomParam parameter, SomeObject parent) on type SomeType
Estou tentando abordar esse problema, substituindo o ExecuteAsync
método de ApiController
mas sem sorte até agora. Algum conselho sobre esse assunto?
Editar: esqueci de mencionar que agora estou tentando mover esse código na API da Web do ASP.NET, que tem uma abordagem diferente ao roteamento. A questão é: como faço para que o código funcione na API da Web do ASP.NET?
c#
asp.net-web-api
paulius_l
fonte
fonte
Respostas:
Esta é a melhor maneira que encontrei para oferecer suporte a métodos GET extras e também aos métodos REST normais. Adicione as seguintes rotas ao seu WebApiConfig:
Eu verifiquei esta solução com a classe de teste abaixo. Consegui atingir com êxito cada método no meu controlador abaixo:
Eu verifiquei que ele suporta os seguintes pedidos:
Observe que, se suas ações GET extras não começarem com 'Get', convém adicionar um atributo HttpGet ao método.
fonte
constraints: new{id=@"\d+"}
routes.MapHttpRoute("DefaultApiPut", "Api/{controller}", new {action = "Put"}, new {httpMethod = new HttpMethodConstraint(HttpMethod.Put)});
para o meuPut
método caso contrário ele estava me dando 404.Vá a partir disso:
Para isso:
Portanto, agora você pode especificar para qual ação (método) você deseja enviar sua solicitação HTTP.
postar em "http: // localhost: 8383 / api / Command / PostCreateUser" chama:
e postar em "http: // localhost: 8383 / api / Command / PostMakeBooking" chama:
Eu tentei isso em um aplicativo de serviço de API WEB auto-hospedado e funciona como um encanto :)
fonte
[HttpGet]
,[HttpPost]
, etc. atributos para mapear o verbo para o método.Acho que os atributos são mais limpos de usar do que adicioná-los manualmente via código. Aqui está um exemplo simples.
Você também precisa disso no seu webapiconfig
Some Good Links http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api Este explica melhor o roteamento. http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api
fonte
config.MapHttpAttributeRoutes();
ao meuWebApiConfig.cs
eGlobalConfiguration.Configuration.EnsureInitialized();
no final do meuWebApiApplication.Application_Start()
método para obter atributos de rota para o trabalho.config.MapHttpAttributeRoutes();
precisa comparecer perante o mapeamento da rota (por exemplo, antesconfig.Routes.MappHttpRoute(...
.Você precisa definir outras rotas no global.asax.cs como este:
fonte
Com o Web Api 2 mais novo, ficou mais fácil ter vários métodos de obtenção.
Se o parâmetro passado para os
GET
métodos for diferente o suficiente para o sistema de roteamento de atributos diferenciar seus tipos, como é o caso deint
s eGuid
s, você pode especificar o tipo esperado no campo[Route...]
atributoPor exemplo -
Para mais detalhes sobre essa abordagem, clique aqui http://nodogmablog.bryanhogan.net/2017/02/web-api-2-controller-with-multiple-get-methods-part-2/
Outra opção é fornecer aos
GET
métodos rotas diferentes.Veja aqui para mais detalhes - http://nodogmablog.bryanhogan.net/2016/10/web-api-2-controller-with-multiple-get-methods/
fonte
No ASP.NET Core 2.0, você pode adicionar o atributo Route ao controlador:
fonte
Eu estava tentando usar o roteamento de atributos da Web Api 2 para permitir vários métodos Get, e eu incorporara as sugestões úteis das respostas anteriores, mas no Controller eu havia decorado apenas o método "especial" (exemplo):
... sem também colocar um [RoutePrefix] na parte superior do controlador:
Eu estava recebendo erros informando que não foi encontrada nenhuma rota correspondente ao URI enviado. Depois que o [Route] decorava o método e o [RoutePrefix] decorava o Controller como um todo, funcionou.
fonte
Não tenho certeza se você encontrou a resposta, mas fiz isso e funciona
Agora no global.asx
fonte
Você já tentou mudar para WebInvokeAttribute e definir o método como "GET"?
Acredito que tive um problema semelhante e mudei para informar explicitamente qual método (GET / PUT / POST / DELETE) é esperado na maioria dos métodos, se não todos.
O WebGet deve lidar com isso, mas já vi alguns problemas com o Get múltiplo e muito menos o Get do mesmo tipo de retorno.
[Editar: nada disso é válido com o pôr do sol do WCF WebAPI e a migração para o ASP.Net WebAPI na pilha MVC]
fonte
fonte
A alternativa de preguiça / pressa (Dotnet Core 2.2):
Ligando para eles:
"olá42"
"world99"
fonte
Nenhum dos exemplos acima funcionou para minhas necessidades pessoais. A seguir, é o que acabei fazendo.
Para usar o acima em sua rota, use:
O que acontece é o tipo de restrição de falhas no método, para que essa rota corresponda apenas aos métodos padrão GET, POST, PUT e DELETE. O "true" diz que queremos verificar se há uma correspondência dos itens na matriz. Se fosse falso, você estaria dizendo excluir aqueles no strVocê pode usar rotas acima deste método padrão, como:
No exemplo acima, ele está basicamente procurando o seguinte URL =>
http://www.domain.com/Account/Status/Active
ou algo parecido.Além do exposto, não tenho certeza se ficaria louco demais. No final do dia, deve ser por recurso. Mas vejo a necessidade de mapear URLs amigáveis por vários motivos. Estou me sentindo bastante certo, à medida que a Web Api evolui, haverá algum tipo de provisão. Se tiver tempo vou construir uma solução mais permanente e postar.
fonte
new System.Web.Http.Routing.HttpMethodConstraint(HttpMethod.Get, HttpMethod.Post, HttpMethod.Put, HttpMethod.Delete)
lugar.Não foi possível fazer com que nenhuma das soluções de roteamento acima funcione - algumas das sintaxes parecem ter mudado e eu ainda sou novo no MVC - em uma pitada, apesar de eu ter reunido esse truque realmente terrível (e simples) que vai me deixar por enquanto - note, isso substitui o método "public MyObject GetMyObjects (long id)" - alteramos o tipo de "id" para uma string e alteramos o tipo de retorno para objeto.
fonte
Se você tiver várias ações no mesmo arquivo, passe o mesmo argumento, por exemplo, ID para todas as ações. Isso ocorre porque a ação pode apenas identificar o ID. Portanto, em vez de atribuir qualquer nome ao argumento, declare o ID dessa forma.
fonte
Alternativa Simples
Basta usar uma string de consulta.
Encaminhamento
Controlador
solicitações de
Nota
Lembre-se de que o parâmetro da cadeia de caracteres de consulta não deve ser "id" ou qualquer que seja o parâmetro na rota configurada.
fonte
Modifique o WebApiConfig e adicione no final outro Routes.MapHttpRoute como este:
Em seguida, crie um controlador como este:
Foi assim que eu resolvi. Espero que ajude alguém.
fonte