Bon, je dois être en manque de quelque chose de tout à fait simple ici, parce que j'ai été googler pour les jours, et en regardant des dizaines de réponses, et d'ici-là, et j'ai juste NE peut pas obtenir que cela fonctionne, peu importe ce que j'ai essayé. Le service fonctionne parfaitement bien lorsqu'il est appelé sur HTTP normal.
Voici notre programme d'installation... nous avons un domaine, http://www.mydomain.com . Nous avons un certificat SSL installé sur ce domaine de thawte, comme nous le ferions si nous étions à la sécurisation d'un site de e-commerce. Que tous fonctionne bien, et je peux aller à l'adresse http**s**://www.mydomain.com et il fonctionne. Je suis sous VS2008, .NET 3.5 site sur Windows Server 2003 R2.
Maintenant, j'ai ajouté une Silverlight activé service WCF pour mon site, j'ai envie de communiquer avec plus de SSL. Si je parcourir pour http**s**://www.mydomain.com/myservice.svc il me montre le WSDL-descriptive "Vous avez créé un service" à la page comme prévu, ce qui montre pour la création de votre client à l'aide de
svcutil.exe https:// ...
EDIT: j'ai réalisé l'url indiquée pour la svcutil dans le fichier wsdl a été fait de pointage de la boîte physique nom du serveur web, pas le bon domaine. Je suis donc allé à travers les étapes indiquées dans ce blogue pour mettre à jour le SecureBinding du site web dans IIS à l'aide du script adsutil. Maintenant, le fichier wsdl montre la bonne SSL adresse, mais j'obtiens toujours la même erreur.
Maintenant, je suis allé et a essayé de crochet de mon application Silverlight jusqu'à elle, et il ne fonctionne pas, le retour d'une exception dans le résultat de la appels asynchrones, déclarant que "Le serveur distant a retourné une erreur: NotFound. Un certain nombre de blogs que je l'ai lu, parlé en la fermant à Silverlight problèmes par la création d'un test d'application Windows, et en essayant de référence de. Eh bien, je l'ai fait et même dans une application régulière des fenêtres en essayant d'accéder au service via SSL j'obtiens une exception indiquant:
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)
Ceci malgré le fait que j'ai ajouté explicitement la référence de service pour les applications Windows en utilisant le HTTPS régime et correctement obtient toutes les méthodes et les affiche dans Intellisense dans l'éditeur.
Notez que c'est un service qui ne nécessite PAS explicite connectez-vous sur la part de l'utilisateur. Je vais envoyer des en-têtes personnalisés dans mes enveloppes SOAP pour vérifier que les demandes sont à venir à partir de notre application, et je veux juste garder les prédateurs de sniffer de la ligne et de sélectionner les en-têtes personnalisés.
Maintenant, pour le code, je dois juste avoir quelque peu stupide mauvais réglage, parce que de tout ce que j'ai lu, cela devrait être un exercice simple.
Tout d'abord, mon service de la classe code-behind est décoré avec les attributs suivants:
<ServiceBehavior(AddressFilterMode:=AddressFilterMode.Any)>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
Le ServiceModel section de mon site web.config sur le serveur ressemble à ceci:
<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>
Et le ServiceModel section de l'app.config dans mon application Windows se présente comme suit:
<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>