Professional Documents
Culture Documents
ServiciosWCF:ConsumirporRESTySOAPsimultaneamenteeledwin.com
ServiciosWCF:ConsumirporRESTy
SOAPsimultaneamente
Publicadoel17/05/2014|1847visitas
Regresandonuevamentedeunosdasconmucho
trabajoquierocompartirconustedesestetutorial
paraconstruirunserviciowebcontecnologa
WCFyloexpondremosporSOAPyREST
simultneamente.
Antesdeiralcdigoprestemosatencinalaimagenanterior.Normalmenteestoseraloqueyohago
situvieraqueexponerinformacinhaciaunoovariosaplicativosenmismasodiferentesplataformas
ytecnologas.
Pararealizarestetutorialvamosasuponerqueesunsistemadecomprasonlineyvamosaexponer
unaAPIpublicaparaconsultadeproductos.
VamosaexponerporSOAPhaciaunaaplicacindeescritorioyporRESThaciaunsitioWebque
consumiremosporAjax.
data:text/htmlcharset=utf8,%3Ch1%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20fontfamily%3A%20Oswald%2C%20Ari
1/7
24/7/2015
ServiciosWCF:ConsumirporRESTySOAPsimultaneamenteeledwin.com
EntendiendolosconceptosbsicosWCF,
SOAPyREST
Yaquenoestemadeestetutorialcontextualizarnossobreestastecnologasvoysimplementeacitar
algunossitiosdondepodrnconocerencasodequenotenganniideadequesetrataesto.
WCF
QueesWindowsCommunicationFoundation[ingls]
WindowsCommunicationFoundationWikipedia[ingls]
SOAP
SimpleObjectAccessProtocolWikipedia
REST
RepresentationalStateTransfer
Sabiendoesto,vamosainiciarlaconstruccindenuestropequeoproyectoenVisualStudio2010y
Framework4.0osuperior.
VamosacrearunanuevaaplicacinWebvaciaoASP.NETEmptyWebApplicationqueyo
llamarMiMercado.
Eneste,creareunacarpetallamadaServicesyenestacarpetavoyacrearmiServicioWCFhaciendo
clicderechosobrelacarpeta,Aadir,Nuevoelementoybuscamos"ServicioWCFHabilitadopara
AJAX"o"AJAXenabledWCFService"quellamaremos"MiMercadoService.svc".
data:text/htmlcharset=utf8,%3Ch1%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20fontfamily%3A%20Oswald%2C%20Ari
2/7
24/7/2015
ServiciosWCF:ConsumirporRESTySOAPsimultaneamenteeledwin.com
EstenoesmsqueunservicioWCFcomn,loquepasaalcrearunserviciohabilitado
paraAJAXesqueseaadenalgunosatributosadicionalesenelarchivodeconfiguracin
eInterfaz,propiedadesyconfiguracionesquepodemosaadirmanualmentesinningn
inconveniente.
Quetenemosalcrearelnuevoservicio
WCF?
ArchivoMiMercadoService.svc.cs
Estearchivoeslaimplementacindelservicioweb.Aquiseespecificancadaunodelosmtodosu
Operacionesdecontrato(OperationContract).Cadaunodeestosmtodosserexpuestosiemprey
cuandotengalapropiedad[OperationContract]sobreelmismo.Comoejemplotenemosel
mtodopublicvoidDoWork().
Adicionalmente,veamosqueenladefinicindelaclasetenemosotraspropiedadesque
sonServiceContractyAspNetCompatibilityRequirements,estesegundohabilitala
compatibilidadconASP.NET.
ArchivoWeb.Config
Aquipodemosevidenciarquesehacreadounnuevoniveldeconfiguracin
llamadosystem.serviceModel,aquseconfiguranlosserviciosWCF.
Tenemoslosservicesquesonladefinicindecadaunodelosserviciosquetengamos,
losbehaviorssonlaconfiguracindeloscomportamientosdeestosserviciosy
data:text/htmlcharset=utf8,%3Ch1%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20fontfamily%3A%20Oswald%2C%20Ari
3/7
24/7/2015
ServiciosWCF:ConsumirporRESTySOAPsimultaneamenteeledwin.com
finalmenteserviceHostingEnvironmentquenospermiteestablecerparmetrosdeconfiguracin
paraelhostdeserviciosengeneral.
ConfigurarEndPointRESTySOAPen
WCF
EnWCFexisteunconceptollamadoEndPoint,estoenpalabrassimplessonpuntosdeaccesoenel
servidor,podemosverlocomoejecutarunescuchadordesolicitudes.Enestecasocrearemos
unEndPointpararecibirlassolicitudesRESTyotroparalassolicitudesSOAP.Parahacerestonos
ubicamosenlaseccindeservicesdelarchivoweb.config.Encontraremosalgosimilaraesto:
<services>
<servicename="MiMercado.Services.MiMercadoService">
<endpointaddress=""behaviorConfiguration="MiMercado.Services.MiMerc
</service>
</services>
EsteEndPointexistenterecibesolicitudesRESTyaquetieneelwebHttpBindinglonicoque
haremosesestablecerunaddressparaquepormediodelaurldelserviciopodamosdiferenciareste
EndPointconelotroquevamosacrearenseguida.
Noexplicareladdressporahora,perosuusoserevidentecuandoconsumamoselservicio,asque
notepreocupes.
Alatributoaddresspondremoselvalor"rest",queperfectamentepuedesercualquiervalorque
desees.NuestroendPointquedaras:
<endpointaddress="rest"behaviorConfiguration="MiMercado.Services.MiMercadoS
Enlaseccin<endpointBehaviors>encontramosunaetiqueta<enableWebScript/>lacual
debemosreemplazarpor<webHttphelpEnabled="true"/>
<endpointBehaviors>
<behaviorname="MiMercado.Services.MiMercadoServiceAspNetAjaxBehavior">
<webHttphelpEnabled="true"/>
</behavior>
</endpointBehaviors>
AhorayatenemosnuestroserviciolistoparaserconsumidoporREST.Cmoloindicaba
anteriormente,debemoscrearunEndPointparaSOAP,asqueaadiremosunonuevo,exactamente
despusdelqueyatenemoscreadoparaREST.
Todoquedaras:
data:text/htmlcharset=utf8,%3Ch1%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20fontfamily%3A%20Oswald%2C%20Ari
4/7
24/7/2015
ServiciosWCF:ConsumirporRESTySOAPsimultaneamenteeledwin.com
<services>
<servicename="MiMercado.Services.MiMercadoService"behaviorConfiguration
<endpointaddress="rest"behaviorConfiguration="MiMercado.Services.Mi
<endpointaddress=""binding="basicHttpBinding"contract="MiMercado.S
</service>
</services>
Comopuedenver,esteltimoEndPointnotieneunaddress(podemosponerleunoperoparafines
prcticosmegustasinl),elbindingesdiferente(basicHttpBinding)yhemosquitadoel
atributobehaviorConfiguration.Esteltimoesopcionalypodemosestablecerloparahacer
configuracionesmsavanzadasqueparaestetutorialnonecesitamos.
Siestsponiendobuenaatencinnotarsquetambinagregamosunatributoala
etiqueta<service>llamadobehaviorConfiguration,estoservirparaespecificarun
comportamientodiferentealservicio.
YaqueestablecimoselvalorDefaultBehaviordebemosdefinirestebehaviorenlaseccin
de<serviceBehaviors>queporcierto,debemosaadirlainmediatamentedespus(oantes)dela
seccin<endpointBehaviors>.Parafinalizar,nuestroserviceModelquedadelasiguientemanera:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behaviorname="MiMercado.Services.MiMercadoServiceAspNetAjaxBeha
<webHttphelpEnabled="true"/>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behaviorname="DefaultBehavior">
<serviceMetadatahttpGetEnabled="true"/>
<serviceDebugincludeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironmentaspNetCompatibilityEnabled="true"multipleSite
<services>
<servicename="MiMercado.Services.MiMercadoService"behaviorConfigura
<endpointaddress="rest"behaviorConfiguration="MiMercado.Service
Aadirfuncionalidadalservicio
TenemosunserviciowebWCFquerespondeasolicitudesSOAPyREST,perosolotieneunmtodo
DoWork()quenohacenadabien,latareaahoraescrearfuncionesquehaganalgo,ycomoestamos
haciendounatiendapuesloinicialserretornarunalistadeproductos.
Paracomenzar,creemosunaclasequenostransportarlainformacin,estalallamaremosProducto
data:text/htmlcharset=utf8,%3Ch1%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20fontfamily%3A%20Oswald%2C%20Ari
5/7
24/7/2015
ServiciosWCF:ConsumirporRESTySOAPsimultaneamenteeledwin.com
[DataContract]
publicclassProducto
{
[DataMember]
publicintProductoID{get;set;}
[DataMember]
publicstringNombre{get;set;}
[DataMember]
publicdoublePrecio{get;set;}
}
Alasclasesconlasquevamosatransportarinformacindebemosagregarlela
propiedad[DataContract]yacadaatributodelaclaseel[DataMember].
Ahoravamosacrearunmtodoqueretorneunalistadeproductos.
[WebGet(UriTemplate="/productos",ResponseFormat=WebMessageFormat.Json)]
[OperationContract]
publicList<Producto>ListarProductos()
{
//Crearlistadeproductosyaadirelementos
List<Producto>productos=newList<Producto>();
productos.Add(newProducto()
{
ProductoID=0,
Nombre="MotorolaMotoG",
Precio=4500000
});
productos.Add(newProducto()
{
ProductoID=1,
Nombre="SonyVaioUltra",
Precio=950000
});
Bien,tenemosunmtodocomnycorrientecondospropiedades"extraas":
[OperationContract]quenospermitehabilitarelmtodoparaqueseaexpuestopormediodel
servicio,estonosdicequesinestapropiedadnopodramosinvocarloyaquenoestaradisponible.
[WebGet]exponeesteservicioparaunasolicitudHTTPGET(SilestesobreRESTsabrsmaso
menosdequesetrata).ParaestoespecificamosunUriTemplateconvalor"/productos"paraquepor
mediodelaurlinvoquemoslocalhost/productosenlugardelocalhost/ListarProductos.
Laconfiguracin[WebGet]y[WebInvoke]sonnicamenteparaREST,siquieres
trabajarsimplementeconSOAPnonecesitasestablecerestaspropiedades.
data:text/htmlcharset=utf8,%3Ch1%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20fontfamily%3A%20Oswald%2C%20Ari
6/7
24/7/2015
ServiciosWCF:ConsumirporRESTySOAPsimultaneamenteeledwin.com
AhorapodemosprobarnuestromtododeconsultaejecutandonuestroproyectoWeb.
CmoprobarservicioWebRESTySOAP
ParaprobarunservicioRESTexistenvariasherramientasdeusolibreymuybuenasquepodemos
utilizar,entrelasqueheexploradoencuentrolassiguientescomoaplicacionesdeGoogle
Chrome:PostmanRestClient,RestConsole,AdvancedRestClient.Encontrarsmuchasmsynosolo
paraGoogleChrome,tambinparaFirefoxyparaescritorio,escuestindebuscar.
ParasolicitudesRESTdetipoGETtambinpuedesutilizarelexploradordeInternetas:
data:text/htmlcharset=utf8,%3Ch1%20style%3D%22margin%3A%200px%3B%20padding%3A%200px%3B%20fontfamily%3A%20Oswald%2C%20Ari
7/7