Bien, me debe faltar algo muy simple aquí, porque he estado buscando en google por días, y mirando a docenas de respuestas allí, y aquí, y yo simplemente NO puede conseguir que esto funcione, no importa lo que yo he probado. El servicio funciona perfectamente bien cuando se llama a través de HTTP plano.

Aquí está nuestra instalación… tenemos un dominio, http://www.mydomain.com . Hemos instalado un certificado SSL en el dominio de thawte, como si fuésemos la obtención de un sitio de e-commerce. Que todo funciona bien, y puedo ir a https://www.mydomain.com y funciona bien.
Me estoy quedando en VS2008, .NET 3.5 sitio en Windows Server 2003 R2.

Ahora, he añadido un Silverlight habilitado el servicio de WCF a mi sitio, que me quiere comunicar a través de SSL. Si me vaya a https://www.mydomain.com/myservice.svc, me muestra el WSDL-descriptivo «ha creado un servicio de» de la página como se esperaba, que muestra a crear su cliente con

svcutil.exe https://... 

EDICIÓN: me di cuenta de que la url que se muestra para el svcutil en el archivo wsdl era en realidad apunta a la física cuadro nombre del servidor web, no el dominio apropiado. Así que me fui a través de los pasos que se muestran en esta publicación del blog a actualizar la SecureBinding de la página web en IIS con la adsutil secuencia de comandos. Ahora el archivo wsdl muestra la correcta dirección de SSL, pero me sigue apareciendo el mismo error.

Ahora me fui y traté de gancho de mi aplicación de Silverlight y no funciona, devolver una excepción en el resultado de las llamadas asincrónicas, declarando que «El servidor remoto devolvió un error: NotFound. Un número de los blogs que he leído hablado de reducir la lista a problemas de Silverlight mediante la creación de una prueba de aplicación de Windows, y tratando de hacer referencia a ella desde que. Bueno, yo hice eso y aún en una aplicación de windows normal tratando de acceder al servicio a través de SSL obtengo una excepción que indica:

System.ServiceModel.EndpointNotFoundException: 
There was no endpoint listening at https://www.mydomain.com/mysubdir/myservice.svc that could accept the message. 
This is often caused by an incorrect address or SOAP action. 
See InnerException, if present, for more details. ---> 
System.Net.WebException: The remote server returned an error: (404) Not Found.
at System.Net.HttpWebRequest.GetResponse()
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

Esto a pesar del hecho de que me agrega explícitamente el servicio de referencia para la aplicación de Windows usando HTTPS esquema y correctamente obtiene todos los métodos y los muestra en Intellisense en el editor.

Tenga en cuenta que este es un servicio que NO requieren expresamente la sesión por parte del usuario. Voy a ser el envío de cabeceras personalizadas en mi JABÓN de sobres para verificar que las solicitudes provienen de nuestra aplicación, y sólo quiero mantener a los depredadores de oler la línea y escoger las cabeceras personalizadas.

Ahora el código, donde sólo debo tener algún estúpido pequeño ambiente de malo, porque de todo lo que he leído, esto debería ser bastante sencillo ejercicio.

Primero, mi servicio es de clase de código subyacente está decorado con los siguientes atributos:

<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)> 
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>

La ServiceModel sección de mi web.config en el servidor se ve así:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="basicHttpBinding">
                <security mode="Transport">
                    <transport clientCredentialType ="None"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <behaviors>
        <serviceBehaviors>
            <behavior name="standingsBehavior">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
        <baseAddressPrefixFilters>
            <add prefix="http://www.mydomain.com:80"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
    <services>
        <service behaviorConfiguration="standingsBehavior" name="lijslwebdata">
            <endpoint address="" binding="basicHttpBinding" contract="lijslwebdata"/>
            <!--<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>-->
        </service>
    </services>
</system.serviceModel>

Y la ServiceModel sección de la aplicación.config en mi aplicación de Windows el siguiente aspecto:

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_lijslwebdata" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" 
                sendTimeout="00:01:00" allowCookies="false" 
                bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" 
                maxReceivedMessageSize="65536" messageEncoding="Text" 
                textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192"
                    maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="Transport">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="https://www.mydomain.com/mysubdir/myservice.svc"
            binding="basicHttpBinding" 
            bindingConfiguration="BasicHttpBinding_lijslwebdata"
            contract="xdata.lijslwebdata" name="BasicHttpBinding_lijslwebdata" />
    </client>
</system.serviceModel>
  • Una pregunta, ¿el baseAddressPrefixFilters deben ser puestos a HTTPS en alguna forma??
  • Realmente me gustaría estar interesado en esto, también. Tengo un HTTP WCF servicio en el momento y esperar problemas al proporcionar la opción de HTTPS. Por favor, recuerde publicar tu resultado! 🙂
InformationsquelleAutor eidylon | 2009-10-05

10 Comentarios

  1. 27

    Tuve este mismo problema en mi final. Tu post me ayudó a entender qué se trata la cuestión. aquí está mi modelo de servicio de la sección. Descubrí que las claves fueron la httpsGetEnabled, a continuación, ajuste el bindingconfiguration espero que esto ayude.

    <system.serviceModel>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="RequestImageBehavior">
                        <serviceMetadata **httpsGetEnabled**="true" />
                        <serviceDebug includeExceptionDetailInFaults="false" />
                      <dataContractSerializer maxItemsInObjectGraph="1073741824" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <services>
                <service behaviorConfiguration="RequestImageBehavior" name="RequestImage">
                    <endpoint address="" 
                              binding="wsHttpBinding" 
                              **bindingConfiguration**="HttpsBinding"
                              contract="IRequestImage">
                    </endpoint>
                    <endpoint address="mex" 
                              binding="mexHttpBinding" 
                              contract="IMetadataExchange" />
                </service>
            </services>
          <bindings>
            **<wsHttpBinding>
              <binding name="HttpsBinding">
                <security mode="Transport">
                  <transport clientCredentialType="None"/>
                </security>
              </binding>
            </wsHttpBinding>**
          </bindings>
        </system.serviceModel>
    • Yo tenía la misma resolución. Me encontré con que mi bindingConfiguration no se ha establecido pero mi bindingName fue. Una vez que establezca la configuración de enlace de las cosas comenzó a trabajar como se debe. Gracias!
    • Configuración de bindingConfiguration resuelto mi problema. Gracias!
    • +1 Esta solucionado mi problema!!!! Genial!!!
    • Este fijo que es para mí, PERO tuve que cambiar de nombre <wsHttpBinding> a <webHttpBinding – tal vez una diferencia en .Las versiones?
    • theyetiman, check-out este enlace para ver la diferencia entre wsHttpBinding y webHttpBinding. Totalmente diferente del juego de pelota. stackoverflow.com/questions/2650785/…
  2. 11

    Yo estaba lidiando con esto hace poco, y desea agregar un tweak. Si usted sigue las instrucciones anteriores, usted será capaz de obtener el servicio para trabajar con HTTPS, pero no de trabajar simultáneamente en HTTP y HTTPS. Para hacer eso, usted necesita tener dos extremo de configuración de los nodos, uno por cada protocolo de la siguiente manera:

     <service name="MyCompany.MyService" >
        <endpoint address="" behaviorConfiguration="AspNetAjaxBehavior"
          binding="webHttpBinding" contract="MyCompany.MyService" bindingConfiguration="sslBinding" />
        <endpoint address="" behaviorConfiguration="AspNetAjaxBehavior"
          binding="webHttpBinding" contract="MyCompany.MyService" />
      </service>

    (tomado de mi codebase, ajustar behaviorConfiguration y vinculante según corresponda)

    • Gracias!! De hecho, me encontré con que mi servicio de SSL a través de HTTPS devuelve un 404 sin el HTTP extremo. Agregar el extremo HTTP fija. Ridículo.
  3. 8

    Acabo de pasar un par de horas en esto y resultó que mi problema era el nombre del servicio

    <services>
          <service name="TimberMill.Web.Data.LogReceiverService">
            <endpoint binding="basicHttpBinding" bindingConfiguration="basicBinding"
                         contract="NLog.LogReceiverService.ILogReceiverServer" />
          </service>
        </services>

    tenía que coincidir exactamente con la entrada similar en mi *.svc archivo.

    <%@ ServiceHost 
        Language="C#" 
        Debug="true" 
        Service="TimberMill.Web.Data.LogReceiverService, TimberMill.Web"
        Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"
        CodeBehind="LogReceiverService.svc.cs" 
    %>

    No estoy seguro de si se refería a mi uso de la Autofac.
    Todo estaba funcionando bien, en virtud de la llanura de HTTP.
    No en HTTPS, aunque.

    Bueno, yo creo que es así, no quiero molestar nada ahora por pruebas en más detalle por temor a la ira de la WCF-Config dioses y mi config se rompe de nuevo. YMMV.

    • Sí serviceName fijo, que para mí
    • Trabajó para mí, gracias!
  4. 3

    En mi caso no de estas respuestas ayudaron.

    Lugar, necesitaba añadir un duplicado <unión> sección que no tiene nombre conjunto de atributos.

    Aquí es el volcado de la correspondiente sección de mi web del servicio.archivo de configuración:

    <behaviors>
        <serviceBehaviors>
            <behavior name="ServiceBehaviour">
                <serviceMetadata 
                    httpsGetEnabled="true" 
                    httpsGetUrl="RemoteSyncService.svc"
                    httpGetBindingConfiguration="bindingConfig" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
            <behavior name="">
                <serviceMetadata 
                    httpsGetEnabled="true" 
                    httpsGetUrl="RemoteSyncService.svc" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    
    <bindings>
      <basicHttpBinding>
        <binding name="bindingConfig" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
            <security mode="Transport">
              <transport clientCredentialType="None"/>
            </security>
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
        </binding>
    
        <!-- Add binding with EMPTY/MISSING name, see https://forums.iis.net/t/1178173.aspx -->
        <binding maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
            <security mode="Transport">
              <transport clientCredentialType="None"/>
            </security>
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
        </binding>
      </basicHttpBinding>
    </bindings>

    Espero que esto podría ser útil para alguien, algún día.

    • Sólo para validar este post, esta fue la única sugerencia que trabajó para mí
  5. 2

    Yo tenía el mismo problema y lo pasó un día para resolver este problema. Finalmente, por debajo de la configuración trabajado conmigo para el acceso HTTPS.

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="basicHttpBinding">
                </binding>
                <binding name="basicHttpsBinding">
                    <security mode="Transport">
                        <transport clientCredentialType ="None"/>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="standingsBehavior">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
            <baseAddressPrefixFilters>
                <add prefix="http://www.mydomain.com/"/>
            </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
        <services>
            <service behaviorConfiguration="standingsBehavior" name="lijslwebdata">
                <endpoint address="" binding="basicHttpBinding" contract="lijslwebdata"/>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
            <service behaviorConfiguration="standingsBehavior" name="sslwebdata">
                <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="sslwebdata"/>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
    </system.serviceModel>
  6. 1

    Todo parece ser muy válida, no evidentes errores en todos los…

    Sólo una observación/pregunta: ¿dónde está tu *.svc archivo ubicado??

    En el mensaje de error, veo:

     https://www.mydomain.com/myservice.svc 

    Es su *.svc archivo realmente en el nivel superior del directorio virtual de su sitio?

    Normalmente, el *.svc archivo dentro de un directorio virtual en IIS y por lo tanto la dirección sería algo como:

     https://www.mydomain.com/YourVirtualDirectory/myservice.svc 

    Por supuesto, usted puede implementar una ASP.NET aplicación y un servicio de WCF *.svc archivo a la raíz de tu IIS – pero no es muy común, en mi experiencia.

    Sólo una cosita para comprobar…..

    Marc

    • Sí, no, el servicio está en un sub-directorio. He cambiado el nombre de los caminos para la seguridad propuesto. Creo que debería de haber puesto en un subdirectorio en el falso camino, pero no, está en un subdirectorio.
  7. 1

    Bueno, al parecer se ha solucionado el problema, y no tengo absolutamente ninguna idea de por qué/cómo.

    Esto es lo que hice.

    • He añadido un NUEVO VACÍO en Silverlight habilitado el servicio de WCF
    • He actualizado la web.config para reflejar tanto los servicios de
    • Yo entonces, literalmente, acaba de copiar y pegar todo sobre el primer servicio en el segundo servicio, excepto el nombre.

    Por qué esta arreglado, NO tengo absolutamente ninguna idea.

    Por lo que vale para cualquiera, aquí está mi nueva web.config ServiceModel sección con el segundo servicio en…

    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="basicHttpBinding">
                </binding>
                <binding name="basicHttpsBinding">
                    <security mode="Transport">
                        <transport clientCredentialType ="None"/>
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="standingsBehavior">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                    <serviceDebug includeExceptionDetailInFaults="false"/>
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true">
            <baseAddressPrefixFilters>
                <add prefix="http://www.mydomain.com/"/>
            </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
        <services>
            <service behaviorConfiguration="standingsBehavior" name="lijslwebdata">
                <endpoint address="" binding="basicHttpBinding" contract="lijslwebdata"/>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
            <service behaviorConfiguration="standingsBehavior" name="sslwebdata">
                <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="sslwebdata"/>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
    </system.serviceModel>
    • … y que me llena con el mismo pavor como el resto de WCF/Silverlight hace. Demasiadas variables. Crear un nuevo proyecto desde cero y que «simplemente funciona». No es una opción en el mundo real!!! (He tenido que hacerlo antes). Gracias por tu respuesta.
    • Estoy de acuerdo, … a pesar de que mi problema no era tanto con Silverlight, porque incluso mi prueba de cliente de Windows no se pudo conectar originalmente. Era algo estrictamente con la WCF a través de SSL parte de ella. Pero estoy de acuerdo… no me gusta que las cosas sólo automágicamente corrección de sí mismos. Es una buena tecnología y de todo, solo tiene que ser un poco menos frágil.
  8. 1

    Varias de las respuestas que me llevó a volver a configurar mi web.config para contener dos extremos. Terminé con esta Web siguiente.config.

    <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="basicHttpBinding">
            </binding>
            <binding name="basicHttpsBinding">
              <security mode="Transport">
                <transport clientCredentialType ="None"/>
              </security>
            </binding>
          </basicHttpBinding>
        </bindings>
        <behaviors>
          <serviceBehaviors>
            <behavior name="standingsBehavior">
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
          <baseAddressPrefixFilters>
            <add prefix="http://www.myhost.com"/>
          </baseAddressPrefixFilters>
        </serviceHostingEnvironment>
    
        <services>
          <service behaviorConfiguration="standingsBehavior" name="NameSpace.ClassName">
            <endpoint address="" binding="basicHttpBinding" contract="NameSpace.ContractInterfaceName"/>
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="NameSpace.ContractInterfaceName"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
          </service>
        </services>
      </system.serviceModel>
  9. 0

    No funciona para usted antes, porque el nombre del basicHttpBinding configuración «basicHttpBinding», pero no hizo referencia a que la configuración en su etiqueta con el bindingConfiguration=»basicHttpBinding»

    En los cambios que hizo el trabajo por la adición de otro servicio de configuración, a continuación, hizo referencia a la configuración de enlace que contiene el nodo por lo tanto, causando el trabajo.

  10. 0

    Otra de las cosas para comprobar si usted está encontrando el mismo error 404 como OP. Yo jugueteó con un montón de cosas, pero finalmente la solución vino a sólo agregar el espacio de nombres a mi servicio web.config.

    Tan viejo y simple ServiceFoo y IServiceFoo NO funciona:

      <services>
         <service behaviorConfiguration="quuxBehavior" name="ServiceFoo">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="IServiceFoo"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
         </service>
      </services>

    Pero agregar el espacio de nombres (ProjectBar) HIZO el trabajo:

      <services>
         <service behaviorConfiguration="quuxBehavior" name="ProjectBar.ServiceFoo">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttpsBinding" contract="ProjectBar.IServiceFoo"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
         </service>
      </services>

Dejar respuesta

Please enter your comment!
Please enter your name here