2010-06-14 12 views
9

Creé un servicio WCF y expuse tres puntos finales que son basicHttpBinding, wsHttpBinding y webHttpBinding. Este es un servicio de prueba para mis experimentos con WCF. Pero, cada vez que agrego una referencia de servicio usando el archivo .svc, solo obtengo dos puntos finales (básicos y ws). No parece haber un tercer extremo (webHttpBidning) expuesto por alguna razón.Exponer punto final webHttpBinding en un servicio WCF

Para reproducir este problema, cree un proyecto de aplicación WCF, elimine el servicio Service1, en Agregar nuevo elemento> servicio WCF llamado TestService, y cambiar el archivo de configuración a lo siguiente:

<system.serviceModel> 
<services> 
    <service name="WcfTestService.TestService" behaviorConfiguration="TestServiceBehavior"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://localhost/WcfTestService/TestService.svc"/> 
     </baseAddresses> 
    </host> 
    <endpoint address="basic" 
       binding="basicHttpBinding" 
       contract="WcfTestService.ITestService" /> 
    <endpoint address="ws" 
       binding="wsHttpBinding" 
       contract="WcfTestService.ITestService" /> 
    <endpoint address="web" 
       binding="webHttpBinding" 
       contract="WcfTestService.ITestService" /> 
    <endpoint address="mex" 
       binding="mexHttpBinding" 
       contract="IMetadataExchange" /> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="TestServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" /> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="webBehavior"> 
     <webHttp /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

Aquí el código para ITestService.cs:

[ServiceContract] 
public interface ITestService 
{ 
    [OperationContract] 
    [WebInvoke] 
    Boolean ValidateUser(User user); 
} 

[DataContract] 
public class User 
{ 
    [DataMember(Name = "Name")] 
    public String UserName { get; set; } 
    [DataMember] 
    public String Password { get; set; } 
} 

y para TestService.svc

public class TestService : ITestService 
{ 
    public bool ValidateUser(User user) 
    { 
     if (user.UserName == "User" && user.Password == "123") 
     { 
      return true; 
     } 
     return false; 
    } 
} 

Probé una combinación diferente de los parámetros de WebInvoke y los parámetros de WebGet, pero fallaron.

¿Alguien puede decirme por qué el tercer punto final no se muestra en el archivo WSDL?

Respuesta

5

@decyclone: ​​He expuesto con éxito webHttpBindings sin ningún problema. ¡Pero encontré algo interesante cuando se expone y cuando no!

Veo que la unión de web queda expuesta en Wcf Test Client.

Éstos son mis configuraciones

<services> 
    <service behaviorConfiguration="TestWeb.Service2Behavior" name="TestWeb.Service2"> 
    <endpoint address="" binding="wsHttpBinding" contract="TestWeb.Service2"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="web" binding="webHttpBinding" contract="TestWeb.Service2"> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 

punto a destacar aquí es, su trabajo muy bien usar VS2008 con Framework 3.5, VS2010 con Framework 3.5, cuando uso VS2010 y Framework 4.0, entonces no puedo ver WebHttpBinding conseguir expuesto en WCF Test Client, sin embargo, puedo usar ese binidng para hacer http post en todos los casos.

Supongo que en Framework 4.0 no está visible de forma predeterminada, incluso trato de habilitar EndpointDiscovery pero aún no tengo suerte.

He cubierto este comportamiento en mi WebHttpBinding post

2

Su punto final "web" quedará expuesto como un punto final JSON. No es compatible con WSDL.

+2

Entonces, ¿cómo sabe un cliente qué métodos/tipos están expuestos cuando solo hay un extremo que usa webHttpBinding? – decyclone

+0

Realmente no sé (cómo jQuery transfiere los metadatos). Podría ser otra pregunta. –

+0

@decyclone: ​​consulte la respuesta a su pregunta de seguimiento a continuación. – BillVo

0

está en System.ServiceModel.Web. Si está utilizando vs2010, vaya a las propiedades de su proyecto, verifique el marco de destino. Por defecto apunta a .Net Framework 4 Client Profile. Debería apuntar a .NET Framework 4, luego puede encontrar System.ServiceModel.Web cuando vaya a Agregar referencia

0

@decyclone: ​​Una forma de que un cliente de javascript pueda aprender los métodos disponibles en un webHttpBinding es descargar un proxy javascript WCF con etiquetas de script HTML apuntando a su punto final seguido de "/ js": <script src="http://localhost/WcfTestService/TestService.svc/web/js"></script>

Cuestiones relacionadas