WCF over SSL - 404 error

OK, je dois rater quelque chose de très simple ici, parce que j'ai cherché sur Google pendant des jours, et en regardant des douzaines de réponses là-bas, et là-dessus, et je N'arrive pas à faire marcher ça, peu importe ce que j'ai essayé. Le service fonctionne parfaitement bien lorsqu'il est appelé via un simple HTTP.

voici notre installation... nous avons un domaine, http://www.mydomain.com . Nous avons un certificat SSL installé sur ce domaine de thawte, tout comme nous le ferions si nous obtenions un e-commerce site. Que tous fonctionne bien, et je peux aller à l'adresse http://www.mydomain.com et il fonctionne. J'exécute VS2008, .NET 3.5 site sur Windows Server 2003 R2.

maintenant, j'ai ajouté un service WCF avec Silverlight à mon site, avec lequel je veux communiquer via SSL. Si je parcourir pour http://www.mydomain.com/myservice.svc il me montre le WSDL-descriptive "Vous avez créé un service" la page que prévu, ce qui montre pour la création de votre client à l'aide de

svcutil.exe https:// ... 

EDIT: j'ai réalisé que l'url affichée pour le svcutil dans le fichier wsdl pointait en fait vers le nom de boîte physique du serveur web, pas vers le bon domaine. Je suis donc passé par les étapes indiquées dans cette publication de blog pour mettre à jour la sécurisation du site Web dans IIS en utilisant le script adsutil. Maintenant, le fichier wsdl affiche la bonne adresse SSL, mais j'obtiens toujours la même erreur.

Maintenant, je suis allé et j'ai essayé d'accrocher mon appli Silverlight à elle, et ça ne fonctionne pas, en retournant une exception dans le résultat des appels asynchrones, en disant " le serveur distant a renvoyé une erreur: NotFound. Un certain nombre de blogs que j'ai lu parlé de réduire à des problèmes de Silverlight en créant une application Windows de test, et en essayant de faire référence à partir de cela. Eh bien, j'ai fait cela et même dans une application windows régulière en essayant d'accéder au service sur SSL je reçois 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 explicitement ajouté la référence de service à L'application Windows en utilisant le schéma HTTPS et il obtient correctement toutes les méthodes et les montre dans Intellisense dans l'éditeur.

notez qu'il s'agit d'un service qui ne nécessite pas d'ouverture de session explicite de la part de l'utilisateur. Je vais envoyer des en-têtes personnalisés dans Mes enveloppes de savon pour vérifier que les demandes proviennent de notre application, et je veux juste empêcher les prédateurs de renifler la ligne et à choisir les en-têtes personnalisés.

maintenant au code, où je dois juste avoir un petit réglage stupide erroné, parce que de tout ce que j'ai lu, cela devrait être un exercice assez simple.

tout d'abord, la classe code-behind de mon service est décorée avec les attributs suivants:

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

la section ServiceModel de mon 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 la section "Modèle de service" de l'application.config dans mes fenêtres l'application 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>
35
demandé sur eidylon 2009-10-05 20:37:52

10 réponses

j'avais ce même problème de mon côté. Votre billet m'a aidé à comprendre quel était le problème. voici ma Section modèle de service. J'ai découvert que les clés étaient les httpsGetEnabled puis définir le bindingconfiguration j'espère que cette aide.

<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>
24
répondu 2009-11-12 19:31:28

je traitais avec cela récemment, et je veux ajouter un tweak. Si vous suivez les instructions ci-dessus, vous pourrez faire fonctionner le service avec HTTPS, mais pas simultanément avec HTTP et HTTPS. Pour ce faire, vous devez avoir deux noeuds de configuration de point final, 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>

(tiré de ma base de codes, ajuster la configuration et la liaison du behaviorConfiguration selon le cas)

11
répondu John Ketchpaw 2010-07-07 18:21:26

je viens de passer quelques heures sur ce 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>

a dû 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 que ce soit lié à mon utilisation D'Autofac. Tout fonctionnait bien sous HTTP. Échoué sous HTTPS cependant.

Eh bien je pense que oui, je ne veux pas déranger quoi que ce soit maintenant en testant plus en détail de peur que je ne fâche les dieux de Config de la FMC et que ma config se casse à nouveau. YMMV.

7
répondu fiat 2012-10-10 05:35:16

dans mon cas, aucune de ces réponses n'a aidé.

au Lieu de cela, j'avais besoin de ajouter un doublon <binding> section qui n'a pas de name attribut.

voici le dump de la section appropriée du web de mon service.fichier de configuration:

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

j'espère que cela peut être utile pour quelqu'un, un jour.

3
répondu Uwe Keim 2015-11-08 19:29:01

j'ai eu le même problème et j'ai passé une journée à résoudre ce problème. Enfin, la configuration ci-dessous m'a permis d'accéder à 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>
2
répondu Murali 2011-11-03 14:32:39

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

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

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?

typiquement, le *.svc file est dans un répertoire virtuel sur IIS et donc l'adresse serait quelque chose comme:

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

bien sûr, vous pouvez déployer un ASP.NET app et un service WCF *.le fichier svc à la racine de votre IIS - mais ce n'est pas très commun, dans mon expérience.

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

Marc

1
répondu marc_s 2009-10-05 19:04:48

OK, apparemment j'ai réglé le problème, et je n'ai absolument aucune idée pourquoi/comment.

Voici ce que j'ai fait.

  • j'ai ajouté un tout nouveau service de la FMC compatible avec Silverlight vide
  • j'ai alors mis à jour le web.config pour refléter à la fois les services
  • j'ai alors littéralement copié et collé tout sur le premier service dans le second, sauf le nom.

pourquoi cela l'a réparé, Je n'en ai absolument aucune idée.

FWIW pour quelqu'un, voici mon nouveau site web.config ServiceModel section avec le deuxième service...

<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>
1
répondu eidylon 2009-10-06 18:28:42

Plusieurs réponses m'ont amené à reconfigurer mon web.config pour contenir les deux points de terminaison. J'ai fini avec ce Web suivant.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>
1
répondu Harald Lund 2018-05-07 08:50:29

cela n'a pas fonctionné pour vous avant parce que vous avez nommé votre configuration de connexion BasicHttp "basicHttpBinding" mais n'avez pas fait référence à cette configuration dans votre balise avec le bindingConfiguration="basicHttpBinding"

dans vos modifications qui ont fonctionné en ajoutant une autre configuration de service, vous avez alors fait référence à la configuration de liaison qui contient le noeud, ce qui l'a fait fonctionner.

0
répondu Huzaifa Tapal 2011-07-15 03:33:43

juste une autre chose à vérifier si vous rencontrez la même erreur 404 que L'OP. J'ai bricolé avec beaucoup de choses, mais finalement la solution est venue à simplement ajouter l'espace de nom à mon web de service.config.

ainsi les vieux services et IServiceFoo n'ont pas fonctionné:

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

mais ajouter L'espace de noms (ProjectBar) a fonctionné:

  <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>
0
répondu Matthew Lowe 2014-08-05 16:21:38