41 votes

WCF sur SSL - erreur 404

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>

14voto

John Ketchpaw Points 81

J'avais en face de cela récemment, et souhaitez ajouter un tweak. Si vous suivez les instructions ci-dessus, vous serez en mesure d'obtenir le service fonctionne avec le protocole HTTPS, mais pas de travailler simultanément sur HTTP et HTTPS. Pour ce faire, vous devez avoir deux point de terminaison de la configuration des nœuds, un pour chaque protocole comme suit:

 <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>

(extrait de mon code, ajuster le paramètre behaviorconfiguration et de liaison selon le cas)

8voto

fiat Points 1542

Je viens de passer quelques heures sur ce sujet et il s'est avéré que mon problème était le nom du service

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

avait correspondre exactement à l'entrée similaire dans mon *.svc fichier.

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

Je ne suis pas sûr si c'était lié à mon utilisation de l'Autofac. Tout fonctionnait bien, en vertu de la plaine HTTP. Échoué sous HTTPS si.

Eh bien, je pense que oui, je ne veux pas déranger quoi que ce soit, par des essais en détail plus de peur que je ne la colère de la WCF-Config dieux et ma config interrompt à nouveau. YMMV.

3voto

Murali Points 11

J'ai eu le même problème et j'ai passé une journée à résoudre ce problème. Enfin ci-dessous la configuration travaillé moi pour l'accès 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>

1voto

marc_s Points 321990

Tout semble être tout à fait valable, pas de flagrantes erreurs...

Juste une observation/question: où est votre *.svc fichier??

Dans le message d'erreur, je vois:

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

Est votre *.svc fichier dans le répertoire virtuel de votre site?

Généralement, l' *.svc fichier est à l'intérieur d'un répertoire virtuel dans IIS et ainsi, l'adresse serait quelque chose comme:

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

Bien sûr, vous pouvez déployer un ASP.NET application et un service WCF *.svc fichier à la racine de votre serveur IIS - mais il n'est pas très courant, dans mon expérience.

Juste un thingie à vérifier.....

Marc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X