Estou trabalhando na criação de um novo conjunto de serviços no ASP.MVC MVC 4 usando a API da Web. Até agora, é ótimo. Eu criei o serviço e o fiz funcionar, e agora estou tentando consumi-lo usando o JQuery. Posso recuperar a string JSON usando o Fiddler, e parece estar ok, mas como o serviço existe em um site separado, tentando chamá-lo com erros de JQuery com o "Not Allowed". Portanto, esse é claramente um caso em que preciso usar o JSONP.
Sei que a API da Web é nova, mas espero que alguém possa me ajudar.
Como faço uma chamada para um método de API da Web usando JSONP?
jquery
jsonp
asp.net-mvc-4
asp.net-web-api
Brian McCord
fonte
fonte
Respostas:
Depois de fazer essa pergunta, finalmente encontrei o que precisava, por isso estou respondendo.
Encontrei este JsonpMediaTypeFormatter . Adicione-o
Application_Start
ao seu global.asax fazendo o seguinte:e você deve fazer uma chamada JQuery AJAX que se parece com isso:
Isso parece funcionar muito bem.
fonte
GlobalConfiguration.Configuration.AddJsonpFormatter(config.Formatters.JsonFormatter, "callback");
Aqui está uma versão atualizada do JsonpMediaTypeFormatter para uso com o WebAPI RC:
fonte
Você pode usar um ActionFilterAttribute assim:
Em seguida, coloque-o em sua ação:
fonte
Certamente a resposta de Brian é a correta, no entanto, se você já estiver usando o formatador Json.Net, que fornece datas json bonitas e serialização mais rápida, não é possível adicionar apenas um segundo formatador para o jsonp, é preciso combinar os dois. É uma boa idéia usá-lo de qualquer maneira, como Scott Hanselman disse que o lançamento da API da Web do ASP.NET usará o serializador Json.Net por padrão.
fonte
A implementação de Rick Strahl funcionou melhor para mim com o RC.
fonte
JSONP funciona apenas com solicitação GET HTTP. Há um suporte ao CORS na API da web asp.net que funciona bem com todos os verbos http.
Este artigo pode ser útil para você.
fonte
Atualizada
fonte
Aqui está uma versão atualizada com várias melhorias, que funciona com a versão RTM das APIs da Web.
Accept-Encoding
cabeçalhos da solicitação . Osnew StreamWriter()
exemplos anteriores simplesmente usariam UTF-8. A chamada parabase.WriteToStreamAsync
pode usar uma codificação diferente, resultando em saída corrompida.application/javascript
Content-Type
cabeçalho; o exemplo anterior produziria JSONP, mas com oapplication/json
cabeçalho. Este trabalho é feito naMapping
classe aninhada (cf. Melhor tipo de conteúdo para servir JSONP? )StreamWriter
obtém diretamente os bytes e os grava no fluxo de saída.ContinueWith
mecanismo da Biblioteca Paralela de Tarefas para encadear várias tarefas.Código:
Estou ciente da "hackiness" do
Func<string>
parâmetro no construtor de classe interna, mas foi a maneira mais rápida de contornar o problema que resolve - como o C # só tem classes internas estáticas, ele não pode ver aCallbackQueryParameter
propriedade. Passar oFunc
in vincula a propriedade no lambda, para queMapping
você possa acessá-lo posteriormente emTryMatchMediaType
. Se você tem uma maneira mais elegante, comente!fonte
Infelizmente, não tenho reputação suficiente para comentar, então postarei uma resposta. A @Justin levantou a questão da execução do formatador WebApiContrib.Formatting.Jsonp, juntamente com o JsonFormatter padrão. Esse problema foi resolvido na versão mais recente (lançada há algum tempo). Além disso, ele deve funcionar com a versão mais recente da API da Web.
fonte
johperl, Thomas. A resposta dada por Peter Moberg acima deve estar correta para a versão RC, como o JsonMediaTypeFormatter que ele herdou já usa o serializador NewtonSoft Json e, portanto, o que ele tem deve funcionar sem nenhuma alteração.
No entanto, por que diabos as pessoas ainda usam parâmetros, quando você pode fazer o seguinte
fonte
Em vez de hospedar sua própria versão do formatador JSONP, você pode instalar o pacote WebApiContrib.Formatting.Jsonp NuGet com o já implementado (escolha a versão que funciona com o .NET Framework).
Adicione este formatador em
Application_Start
:fonte
Para aqueles que estão usando o HttpSelfHostServer, esta seção do código falhará no HttpContext.Current, pois não existe no servidor auto-host.
No entanto, você pode interceptar o "contexto" do host próprio por meio dessa substituição.
O request.Method fornece "GET", "POST" etc. e o GetQueryNameValuePairs pode recuperar o parâmetro? Callback. Assim, meu código revisado se parece com:
Espero que isso ajude alguns de vocês. Dessa forma, você não precisa necessariamente de um calço HttpContext.
C.
fonte
Veja este aqui. Veja se isso ajuda.
JSONP com API da Web
fonte
Se o contexto é
Web Api
, agradecendo e se referindo à010227leo
resposta de, você deve considerar oWebContext.Current
valor que seránull
.Então eu atualizei o código dele para isso:
fonte
Podemos resolver o problema do CORS (compartilhamento de recursos de origem cruzada) usando duas maneiras,
1) Usando Jsonp 2) Habilitando o Cors
1) Usando o Jsonp- para usar o Jsonp, precisamos instalar o pacote de nuget WebApiContrib.Formatting.Jsonp e adicionar JsonpFormmater no WebApiConfig.cs, consulte capturas de tela,
Código Jquery
2) Habilitando o Cors -
para habilitar os cors, precisamos adicionar o pacote de nuget Microsoft.AspNet.WebApi.Cors e precisamos habilitar os cors no WebApiConfig.cs
Para obter mais referências, você pode consultar meu repositório de amostra no GitHub usando o link a seguir. https://github.com/mahesh353/Ninject.WebAPi/tree/develop
fonte