Estou começando a usar o projeto MVC4 Web API, tenho um controlador com vários HttpPost
métodos. O controlador é semelhante ao seguinte:
Controlador
public class VTRoutingController : ApiController
{
[HttpPost]
public MyResult Route(MyRequestTemplate routingRequestTemplate)
{
return null;
}
[HttpPost]
public MyResult TSPRoute(MyRequestTemplate routingRequestTemplate)
{
return null;
}
}
Aqui MyRequestTemplate
representa a classe de modelo responsável por manipular o Json passando pela solicitação.
Erro:
Quando faço uma solicitação usando o Fiddler para http://localhost:52370/api/VTRouting/TSPRoute
ou http://localhost:52370/api/VTRouting/Route
recebo um erro:
Foram encontradas várias ações que correspondem à solicitação
Se eu remover um dos métodos acima, ele funciona bem.
Global.asax
Eu tentei modificar a tabela de roteamento padrão global.asax
, mas ainda estou recebendo o erro, acho que tenho problemas ao definir rotas no global.asax. Aqui está o que estou fazendo no global.asax.
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute(
name: "MyTSPRoute",
routeTemplate: "api/VTRouting/TSPRoute",
defaults: new { }
);
routes.MapHttpRoute(
name: "MyRoute",
routeTemplate: "api/VTRouting/Route",
defaults: new { action="Route" }
);
}
Estou fazendo a solicitação no Fiddler usando POST, passando json em RequestBody para MyRequestTemplate.
Uma solução muito melhor para o seu problema seria usar o
Route
que permite especificar a rota no método por anotação:fonte
Route
eTSPRoute
?usar:
não é mais uma abordagem RESTful, mas agora você pode chamar suas ações por nome (em vez de permitir que a API da Web determine automaticamente uma para você com base no verbo) assim:
Ao contrário da crença popular, não há nada de errado com essa abordagem e ela não está abusando da API da Web. Você ainda pode aproveitar todos os recursos impressionantes da API da Web (delegar manipuladores, negociação de conteúdo, formadores de mídia e assim por diante) - basta abandonar a abordagem RESTful.
fonte
Um ponto de extremidade da API da Web (controlador) é um recurso único que aceita verbos get / post / put / delete. É não um controlador normal MVC.
Necessariamente,
/api/VTRouting
pode haver apenas um método HttpPost que aceita os parâmetros que você está enviando. O nome da função não importa , desde que você esteja decorando com o material [http]. Eu nunca tentei, no entanto.Edit: Isso não funciona. Na resolução, parece corresponder ao número de parâmetros, não tentando vincular o modelo ao tipo.
Você pode sobrecarregar as funções para aceitar parâmetros diferentes. Tenho certeza de que você ficaria bem se o declarasse da maneira que faz, mas usasse parâmetros diferentes (incompatíveis) para os métodos. Se os parâmetros forem os mesmos, você não terá sorte, pois o modelo de ligação não saberá qual deles você quis dizer.
Esta parte funciona
O modelo padrão que eles fornecem quando você cria um novo torna isso bastante explícito, e eu diria que você deve seguir esta convenção:
Se você deseja criar uma classe que faça muitas coisas, para o uso do ajax, não há grande motivo para não usar um padrão padrão de controlador / ação. A única diferença real é que suas assinaturas de método não são tão bonitas e é necessário agrupar as coisas
Json( returnValue)
antes de devolvê-las.Editar:
A sobrecarga funciona muito bem ao usar o modelo padrão (editado para incluir) ao usar tipos simples. Também testei o contrário, com 2 objetos personalizados com assinaturas diferentes. Nunca consegui fazê-lo funcionar.
Isso funcionou para mim, neste caso, veja onde isso o leva. Exceção apenas para teste.
E chamado desta forma o console:
fonte
É possível adicionar vários métodos Get e Post no mesmo Web API Controller. Aqui, a rota padrão está causando o problema. A API da Web verifica a rota correspondente da parte superior à inferior e, portanto, a sua rota padrão corresponde a todas as solicitações. Conforme a rota padrão, apenas um método Get e Post é possível em um controlador. Coloque o seguinte código em cima ou Comentar / Excluir rota padrão
fonte
Coloque o prefixo da rota [RoutePrefix ("api / Profiles")] no nível do controlador e coloque uma rota no método de ação [Route ("LikeProfile")]. Não precisa alterar nada no arquivo global.asax
fonte
Eu acho que a pergunta já foi respondida. Eu também estava procurando por algo que fosse um controlador webApi que tivesse os mesmos métodos assinados, mas com nomes diferentes. Eu estava tentando implementar a calculadora como WebApi. A calculadora possui 4 métodos com a mesma assinatura, mas com nomes diferentes.
e no arquivo WebApiConfig você já possui
Basta definir a autenticação / autorização no IIS e pronto!
Espero que isto ajude!
fonte
Você pode usar esta abordagem:
fonte
Não tenho certeza se a sobrecarga do método get / post viola o conceito de API restfull, mas funciona. Se alguém pudesse esclarecer sobre este assunto. E se eu tiver uma uri como
Então, como você pode ver meu diário meio agregado, embora eu possa definir outro controlador para publicação apenas e passar o número de identificação da publicação no meu URL, no entanto, isso dá muito mais sentido. pois minha publicação não existiria sem o próprio periódico.
fonte
Acabei de adicionar "action = action_name" ao URL e, dessa forma, o mecanismo de roteamento sabe qual ação eu quero. Também adicionei o atributo ActionName às ações, mas não tenho certeza de que seja necessário.
fonte
A melhor e mais simples explicação que eu já vi sobre esse tópico - http://www.binaryintellect.net/articles/9db02aa1-c193-421e-94d0-926e440ed297.aspx
Eu consegui trabalhar apenas com o Route e não precisava do RoutePrefix.
Por exemplo, no controlador
e
Em seguida, o nome da função entra no jquery como -
ou
fonte