Você pode expor o serviço em dois pontos de extremidade diferentes. o SOAP pode usar a ligação que suporta SOAP, por exemplo, basicHttpBinding, o RESTful pode usar o webHttpBinding. Presumo que seu serviço REST esteja em JSON; nesse caso, você precisa configurar os dois pontos de extremidade com a seguinte configuração de comportamento
Outra maneira de fazer isso é expor dois contratos de serviço diferentes e cada um com configuração específica. Isso pode gerar algumas duplicatas no nível do código; no entanto, no final do dia, você deseja fazê-lo funcionar.
Ele está dizendo que meu contrato IEvents é inválido quando tento fazer referência à minha interface de serviço: <service name = "Events"> <endereço do ponto de extremidade = "json" binding = "webHttpBinding" behaviorConfiguration = "jsonBehavior" contract = "IEvents" />. Meus IEvents possuem um atributo [ServiceContract] na interface, portanto, não sei por quê. </service>
PositiveGuy
Posso obter localhost: 44652 / MyResource / json para funcionar, mas não consigo obter um ID para trabalhar localhost: 44652 / MyResource / 98 / json . Tentei adicionar um UriTemplate de "/ {id}", também tentei "events / {id}, mas não o encontra quando tento acessar o serviço. Apenas o primeiro funciona, não sei como obtê-lo. ao trabalho.
PositiveGuy
2
Como ele pode funcionar sem nenhum arquivo físico lá? Eu só parecem ter erros 404, deve estar faltando alguma coisa
RoboJ1M
39
Este post já tem uma resposta muito boa por "wiki comunitário" e eu também recomendo a olhar para Web Blog do Rick Strahl, há muitas mensagens boas sobre WCF de lazer como este .
Eu usei os dois para obter esse tipo de serviço MyService ... Então eu posso usar a interface REST do jQuery ou SOAP do Java.
Na verdade, eu uso apenas Json ou Xml, mas os dois estão aqui para fins de demonstração. Essas são solicitações GET para obter dados. Para inserir dados, eu usaria o método com atributos:
Isso é para fins de teste. Apenas para ver se seus terminais estão funcionando. Você já viu o SoapUI? soapui.org
Darrel Miller
@TuomasHietanen - Eu não recebo resposta do tipo JSON usando o comportamento webHttp, mas usando o enableWebScript eu recebo a resposta do tipo JSON. Coloquei ResponseFormat como WebMessageFormat.Json. Por outro lado, não posso usar o URItemplate se usar o comportamento enableWebScript. Alguma ideia?
smile.al.d.way
1
@ CoffeeAddict - Por que você deve usar a interface? Só para ter interface? Você nunca reutilizará essa interface. Isto é mais simples.
Tuomas Hietanen
25
Se você deseja desenvolver apenas um único serviço da Web e hospedá-lo em muitos pontos de extremidade diferentes (por exemplo, SOAP + REST, com saídas XML, JSON, CSV, HTML). Você também deve considerar usar o ServiceStack que eu criei exatamente para esse fim, onde todos os serviços que você desenvolve estão automaticamente disponíveis nos pontos de extremidade SOAP e REST prontos para uso, sem a necessidade de nenhuma configuração.
O exemplo Hello World mostra como criar um serviço simples com apenas (nenhuma configuração necessária):
Ele também vem embutido com uma saída HTML amigável (quando chamada com um cliente HTTP que possui Accept: text / html, por exemplo, um navegador) para que você possa visualizar melhor a saída de seus serviços.
A manipulação de verbos REST diferentes também é tão trivial. Aqui está um aplicativo CRUD de serviço REST completo em 1 página de C # (menos do que seria necessário para configurar o WCF;):
Por padrão, o Windows Communication Foundation (WCF) disponibiliza pontos de extremidade apenas para clientes SOAP. Em Como: Criar um Serviço HTTP da Web Básico do WCF, um ponto de extremidade é disponibilizado para clientes não SOAP. Pode haver momentos em que você queira disponibilizar o mesmo contrato nos dois sentidos, como um terminal da Web e SOAP. Este tópico mostra um exemplo de como fazer isso.
Finalmente, devemos definir o ponto final 2 na definição de serviço. Atenção para o endereço = "" do nó de extremidade, onde REST o serviço não é necessário nada.
Isto é o que eu fiz para fazê-lo funcionar. Certifique-se de colocar webHttp automaticFormatSelectionEnabled = "true" dentro do comportamento do terminal.
[ServiceContract]publicinterfaceITestService{[WebGet(BodyStyle=WebMessageBodyStyle.Bare,UriTemplate="/product",ResponseFormat=WebMessageFormat.Json)]stringGetData();}publicclassTestService:ITestService{publicstringGetJsonData(){return"I am good...";}}
<endpointBehaviors><behaviorname="jsonBehavior"><webHttpautomaticFormatSelectionEnabled="true"/><!-- use JSON serialization --></behavior></endpointBehaviors>
Respostas:
Você pode expor o serviço em dois pontos de extremidade diferentes. o SOAP pode usar a ligação que suporta SOAP, por exemplo, basicHttpBinding, o RESTful pode usar o webHttpBinding. Presumo que seu serviço REST esteja em JSON; nesse caso, você precisa configurar os dois pontos de extremidade com a seguinte configuração de comportamento
Um exemplo de configuração de terminal em seu cenário é
portanto, o serviço estará disponível em
Aplique [WebGet] ao contrato de operação para torná-lo RESTful. por exemplo
Observe que, se o serviço REST não estiver em JSON, os parâmetros das operações não poderão conter um tipo complexo.
Responder à postagem de SOAP e RESTful POX (XML)
Para XML antigo simples como formato de retorno, este é um exemplo que funcionaria tanto para SOAP quanto XML.
Comportamento do POX para XML antigo simples REST
Pontos finais
O serviço estará disponível em
Solicitação REST, experimente no navegador,
SOAP solicita a configuração do terminal do cliente para o serviço SOAP após incluir a referência de serviço,
em c #
Outra maneira de fazer isso é expor dois contratos de serviço diferentes e cada um com configuração específica. Isso pode gerar algumas duplicatas no nível do código; no entanto, no final do dia, você deseja fazê-lo funcionar.
fonte
Este post já tem uma resposta muito boa por "wiki comunitário" e eu também recomendo a olhar para Web Blog do Rick Strahl, há muitas mensagens boas sobre WCF de lazer como este .
Eu usei os dois para obter esse tipo de serviço MyService ... Então eu posso usar a interface REST do jQuery ou SOAP do Java.
Isto é do meu Web.Config:
E esta é a minha classe de serviço (.svc-codebehind, sem necessidade de interfaces):
Na verdade, eu uso apenas Json ou Xml, mas os dois estão aqui para fins de demonstração. Essas são solicitações GET para obter dados. Para inserir dados, eu usaria o método com atributos:
fonte
Se você deseja desenvolver apenas um único serviço da Web e hospedá-lo em muitos pontos de extremidade diferentes (por exemplo, SOAP + REST, com saídas XML, JSON, CSV, HTML). Você também deve considerar usar o ServiceStack que eu criei exatamente para esse fim, onde todos os serviços que você desenvolve estão automaticamente disponíveis nos pontos de extremidade SOAP e REST prontos para uso, sem a necessidade de nenhuma configuração.
O exemplo Hello World mostra como criar um serviço simples com apenas (nenhuma configuração necessária):
Nenhuma outra configuração é necessária e este serviço está disponível imediatamente com o REST em:
Ele também vem embutido com uma saída HTML amigável (quando chamada com um cliente HTTP que possui Accept: text / html, por exemplo, um navegador) para que você possa visualizar melhor a saída de seus serviços.
A manipulação de verbos REST diferentes também é tão trivial. Aqui está um aplicativo CRUD de serviço REST completo em 1 página de C # (menos do que seria necessário para configurar o WCF;):
fonte
O MSDN parece ter um artigo para isso agora:
https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx
Introdução:
fonte
Devemos definir a configuração de comportamento para o terminal REST
e também para um serviço
Após os comportamentos, o próximo passo é as ligações. Por exemplo, basicHttpBinding para o terminal SOAP e webHttpBinding para REST .
Finalmente, devemos definir o ponto final 2 na definição de serviço. Atenção para o endereço = "" do nó de extremidade, onde REST o serviço não é necessário nada.
Na interface do serviço, definimos a operação com seus atributos.
Juntando-se a todas as partes, esta será a nossa definição system.serviceModel do WCF.
Para testar os dois pontos de extremidade, podemos usar WCFClient para SOAP e PostMan para REST .
fonte
Isto é o que eu fiz para fazê-lo funcionar. Certifique-se de colocar
webHttp automaticFormatSelectionEnabled = "true" dentro do comportamento do terminal.
Modelo de serviço interno
Comportamento do EndPoint
fonte