none
Problema con wsHttpBinding y basicHttpBinding durante la configuración del servicio RRS feed

  • Pregunta

  • Buenas tardes,

    actualmente estoy desarrollando mi primer servicio en WCF, en C#, y tengo problemas para la configuración del servicio.

    Una vez desarrollado todo, he modificado el archivo Web.config para cambiar el comportamiento, agregar wsHttpBinding y usarlo en vez de basicHttpBinding. Llevo varios días haciendo pruebas, y mientras que el comportamiento del cliente sí que realiza las preguntas con el protocolo (para usar las credenciales UserName y cambiar el tamaño del mensaje, necesito aproximadamente hasta 4 megas para enviar archivos grandes), el servicio soy incapaz.

    Esta es la configuración del cliente:

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     <configSections>
      <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
       <section name="Uclm.Pfc.Refact.Cliente.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
      </sectionGroup>
      <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
       <section name="Uclm.Pfc.Refact.Cliente.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
      </sectionGroup>
     </configSections>
     <system.serviceModel>
      <bindings>
       <wsHttpBinding>
        <binding name="WsHttpBinding_IRefractVersionService" 
             closeTimeout="00:01:00"
             openTimeout="00:01:00" 
             receiveTimeout="00:10:00" 
             sendTimeout="00:01:00"
             bypassProxyOnLocal="false" 
             hostNameComparisonMode="StrongWildcard"
             maxBufferPoolSize="8388608" 
             maxReceivedMessageSize="8388608"
             messageEncoding="Text">
         <readerQuotas 
          maxDepth="64" 
          maxStringContentLength="8388608"
          maxArrayLength="8388608" 
          maxBytesPerRead="8388608" 
          maxNameTableCharCount="8388608" />
         <security mode="Message">
          <message clientCredentialType="UserName" />
         </security>
        </binding>
       </wsHttpBinding>
      </bindings>
      <client>
       <endpoint 
        address="http://localhost:14605/RefractWS/RefractVersionService.svc"
        binding="wsHttpBinding" 
        bindingConfiguration="WsHttpBinding_IRefractVersionService"
        contract="RefractService.IRefractVersionService" 
        name="WsHttpBinding_IRefractVersionService" />
      </client>
     </system.serviceModel>
    </configuration>
    

    La configuración del servicio es esta, en Web.config:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
     
     <system.web>
      <compilation debug="true" targetFramework="4.0" />
     </system.web>
     
     <system.serviceModel>
    
      <services>
       <service name="RefractVersionService"
            behaviorConfiguration="RefractVersionServiceBehaviors">
        <endpoint address=""
             binding="wsHttpBinding"
             bindingConfiguration="WsHttpBinding_IRefractVersionService"
             contract="RefractWS.IRefractVersionService" />
        <endpoint address="mex"
           binding="mexHttpBinding"
           contract="IMetadataExchange" />
       </service>
      </services>
    
      <bindings>
       <wsHttpBinding>
        <binding name="WsHttpBinding_IRefractVersionService"
             maxReceivedMessageSize="8388608"
             maxBufferPoolSize="8388608"
             messageEncoding="Text">
         <readerQuotas 
          maxDepth="64" 
          maxArrayLength="8388608" 
          maxBytesPerRead="8388608" 
          maxStringContentLength="8388608" 
          maxNameTableCharCount="8388608"/>
         <security mode="Message">
          <message clientCredentialType="UserName"/>
         </security>
        </binding>
       </wsHttpBinding>
      </bindings>
      
      <behaviors>
       <serviceBehaviors>
        <behavior name="RefractVersionServiceBehaviors">
         <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="false"/>
         <dataContractSerializer maxItemsInObjectGraph="8388608"/>
         <serviceThrottling
           maxConcurrentCalls="500"
           maxConcurrentSessions="500"
           maxConcurrentInstances="500"/>
        </behavior>
        <behavior>
         <!-- Para evitar revelar información de los metadatos, establezca el valor siguiente en false y quite el extremo superior de los metadatos antes de la implementación -->
         <serviceMetadata httpGetEnabled="true"/>
         <!-- Para recibir detalles de las excepciones en los fallos, con el fin de poder realizar la depuración, establezca el valor siguiente en true. Para no revelar información sobre las excepciones, establézcalo en false antes de la implementación -->
         <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>
    
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
     </system.serviceModel>
     
     <system.webServer>
      <modules runAllManagedModulesForAllRequests="true"/>
     </system.webServer>
    
    </configuration>
    
    

    Sin embargo, no lo coge. Me di cuenta que se quitaba de ese archivo de configuración esta parte:

        <behavior>
         <!-- Para evitar revelar información de los metadatos, establezca el valor siguiente en false y quite el extremo superior de los metadatos antes de la implementación -->
         <serviceMetadata httpGetEnabled="true"/>
         <!-- Para recibir detalles de las excepciones en los fallos, con el fin de poder realizar la depuración, establezca el valor siguiente en true. Para no revelar información sobre las excepciones, establézcalo en false antes de la implementación -->
         <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
    
    

    Ya no funcionaba, y lo que realmente ejecuta es el basicHttpBinding, la configuración que le tengo puesta se la salta y no me hace caso alguno.

    Esto es lo que sale en el WSDL cuando lo ejecuto con el servidor que va incluido en el Visual Studio 2010:

     <?xml version="1.0" encoding="utf-8" ?> 
    - <wsdl:definitions name="RefractVersionService" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:i0="http://localhost:1415/RefractWS/" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata">
     <wsdl:import namespace="http://localhost:1415/RefractWS/" location="http://localhost:14605/RefractWS/RefractVersionService.svc?wsdl=wsdl0" /> 
     <wsdl:types /> 
    - <wsdl:binding name="<strong>BasicHttpBinding_IRefractVersionService</strong>" type="i0:IRefractVersionService">
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> 
    
    
    Lo que está en negrita no entiendo de dónde lo saca....

    ¿Alguien tiene alguna idea de qué puede ocurrir?

     

    miércoles, 17 de agosto de 2011 17:47

Respuestas

  • Bueno, tras muchas (muchas) vueltas, encontré el fallo.

    Tratando de hacer todo bien, resulta que algo hice mal. Era mi primer servicio web, y cometí un error de bulto por ser muy formal.

    La definición del interfaz era esta:

    [ServiceContract(ConfigurationName = "VersionServices", Namespace = "http://localhost:1415/RefractWS/")]
    Según Microsoft, es la mejor opción. Pero claro, se cambia el namespace, por lo que luego falla (y no te acuerdas que lo redefiniste aquí).

    Debe ser así:

    [ServiceContract]
    Y ya. En este fallo, muchas horas me tiré. Espero que ayude a alguien.

     

     


    • Marcado como respuesta gutinillo sábado, 20 de agosto de 2011 16:46
    sábado, 20 de agosto de 2011 16:46