Bien, me falta algo completamente simple aquí, porque he estado buscando en Google durante días, y mirando docenas de respuestas allí, y aquí en SO, y simplemente NO PUEDO hacer que esto funcione , no importa lo que he intentado. El servicio funciona perfectamente bien cuando se llama a través de HTTP simple.WCF sobre SSL - error 404
Aquí está nuestra configuración ... tenemos un dominio, http://www.mydomain.com. Tenemos un certificado SSL instalado en ese dominio de thawte, tal como lo haríamos si estuviéramos asegurando un sitio de comercio electrónico. Todo funciona bien, y puedo ir a http s: //www.mydomain.com y funciona bien. Estoy ejecutando el sitio VS2008, .NET 3.5 en Windows Server 2003 R2.
Ahora, agregué un servicio WCF habilitado para Silverlight a mi sitio, con el que me quiero comunicar mediante SSL. Si yo vaya a http s: //www.mydomain.com/myservice.svc, que me muestra el WSDL-descriptiva "Se ha creado un servicio de" página como se esperaba, lo que demuestra para crear su cliente utilizando
svcutil.exe https:// ...
EDIT: I realized the url shown for the svcutil in the wsdl file was actually pointing to the physical box name of the web server, not the proper domain. So i went through the steps shown in this blog posting to update the SecureBinding of the website in IIS using the adsutil script. Now the wsdl file shows the correct SSL address, but i still get the same error.
Ahora fui y trataron de conectar mi aplicación Silverlight hasta ella, y no funciona, volviendo una excepción en el resultado de las llamadas asíncronas, afirmando que "el servidor remoto devolvió un error: NotFound. Varios de los blogs que he leído hablaban de limitarlo a problemas de Silverlight al crear una aplicación de Windows de prueba y probar ing para hacer referencia a eso de eso. Bueno, lo hice, e incluso en una aplicación de Windows regulares tratando de acceder al servicio a través de SSL consigo una excepción indicando:
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 he añadido de forma explícita la referencia de servicio a la aplicación de Windows utilizando el 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 requiere el inicio de sesión explícito por parte del usuario. Voy a enviar encabezados personalizados en mis sobres SOAP para verificar que las solicitudes provengan de nuestra aplicación, y solo quiero evitar que los depredadores detecten la línea y seleccionen los encabezados personalizados.
Ahora, al código, donde simplemente debo tener una pequeña configuración estúpida incorrecta, porque por todo lo que he leído, esto debería ser un ejercicio bastante sencillo.
En primer lugar, código subyacente de mi servicio de clase está decorado con los siguientes atributos:
<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
La sección ServiceModel 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 el La sección ServiceModel de la aplicación.config en mi aplicación de Windows tiene 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, ¿la baseAddressPrefixFilters necesita establecerse en HTTPS de alguna manera? – eidylon
Realmente estaría interesado en esto también. Tengo un servicio HTTP WCF en este momento y espero problemas al proporcionar la opción de HTTPS. Por favor, recuerde publicar su resultado! :) –