2009-03-02 31 views
5

Recibo un error al intentar usar WCF Test Client con mi servicio WCF. Aquí está el código de servicio:Error de WCF Test Client: Error al invocar el servicio

[ServiceContract] 
public interface IEmployeeService 
{ 
    [OperationContract(Name = "GetEmployee")] 
    [WebGet(RequestFormat = WebMessageFormat.Xml, 
     UriTemplate = "/Employees/{employeeNumber}")] 
    Employee GetEmployee(string employeeNumber); 
} 

public Employee GetEmployee(string employeeNumber) 
{ 
    var employeeNumberValue = Convert.ToInt32(employeeNumber); 
    var employee = DataProvider.GetEmployee(employeeNumberValue); 
    return employee; 
} 

<system.serviceModel> 
    <services> 
     <service name="Employees.Services.EmployeeService" 
       behaviorConfiguration="metaBehavior"> 
      <endpoint address="" 
         behaviorConfiguration="webHttp" 
         binding="webHttpBinding" 
         contract="Employees.Services.IEmployeeService"> 
      </endpoint> 
      <endpoint address="mex" 
         binding="mexHttpBinding" 
         contract="IMetadataExchange"> 
      </endpoint> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="webHttp"> 
       <webHttp/> 
      </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
      <behavior name="metaBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

soy capaz de conectarse al servicio mediante el cliente de prueba WCF, pero cuando intento de invocar GetEmployee (employeeNumber) me sale el siguiente error:

No se ha podido invocar el servicio. Causas posibles: el servicio está fuera de línea o inaccesible; la configuración del lado del cliente no coincide con el proxy; el proxy existente no es válido. Consulte el seguimiento de la pila para más detalles. Puede tratar de recuperar iniciando un nuevo proxy, restaurando a la configuración predeterminada o actualizando el servicio.

Pude llamar este servicio con éxito al enviar una solicitud desde el navegador.

¿Alguna idea de por qué no puedo usar WCF Test Client?

Respuesta

11

Por favor, ignore mi respuesta anterior. No creo que el problema esté en la configuración del lado del cliente.

Ver WCF Test Client and WebHttpBinding.

This is a limitation of the web programming model itself. Unlike SOAP endpoints (i.e., those with BasicHttpBinding, WSHttpBinding, etc) which have a way to expose metadata about itself (WSDL or Mex) with information about all the operations/ parameters in the endpoint, there's currently no standard way to expose metadata for a non-SOAP endpoint - and that's exactly what the webHttpBinding-based endpoints are. In short, the WCF Test Client won't be useful for web-based endpoints. If some standard for representing web-style endpoints emerges when WCF ships its next version, we'll likely update the test client to support it, but for now there's none widely adopted.

+0

@ stimpy77, simplemente cité de la respuesta vinculada por un empleado de MS. En WCF, el enlace se llama [WebHttpBinding] (http://msdn.microsoft.com/en-us/library/system.servicemodel.webhttpbinding.aspx) y en WSDL 2, se denomina [Enlace HTTP] (http://www.w3.org/TR/wsdl20-adjuncts/#http-binding), pero es bastante claro desde el contexto lo que significa "basado en la web" aquí. El término REST va más allá de simplemente exponer los métodos a través de HTTP. Se trata de tratar las cosas como recursos y usar verbos HTTP, etc. Ver [Richardson Maturity Model] (http://martinfowler.com/articles/richardsonMaturityModel.html). –

0

Creo que su configuración es incorrecta, se debe añadir el modo de seguridad de nodo = "Ninguno" y atribuir bindingConfiguration = "NoneSecurity"

Cambio como mi configuración, vuelve a intentarlo:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="NoneSecurity" 
      maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false"> 
      <readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/> 
      <security mode="None"/> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="Elong.GlobalHotel.Host.IHotelAPIBehavior" 
     name="Elong.GlobalHotel.Host.IHotelAPI"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="NoneSecurity" contract="Elong.GlobalHotel.Host.IIHotelAPI"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Elong.GlobalHotel.Host.IHotelAPIBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
0
I had a similar problem, the solution was in a minor error in the message alias ... that very generic message ... in our case was assigned a Boolean false if the right is true. 
    This value was in the MDM application that was running on websphere. 

el camino en mi caso:

/opt/infamdm/hub/server/resources/cmxserver.properties 
    /opt/infamdm/hub/cleanse/resources/cmxcleanse.properties 
Cuestiones relacionadas