web-dev-qa-db-fra.com

Service WCF retournant 404 sur les demandes de méthode

J'ai une page de service WCF exécutant uniquement WebGets/WebInvokes sur SSL - elle fonctionne correctement sur mon ordinateur local (certificat auto-signé). En production, cependant, je peux accéder à service.svc (et le message indiquant comment utiliser), mais service.svc/AnyRequest renvoie 404. Les deux environnements sont hébergés dans IIS 7.5.

J'ai activé le traçage et le service ne prend même pas les demandes de méthode (par exemple, service.svc/SomeRequest), mais il traite service.svc parfaitement. Il écoute également à https://computername.domain.net/path/service.svc - est-ce normal? Devrait-il normalement pointer sur https://publicfacing.com/path/service.svc?

Notez également que le serveur de production héberge plusieurs sites dans IIS.

Ci-dessous se trouve la section system.serviceModel de mon web.config. Le SSLBehave a été suggéré de ici .

  <system.serviceModel>
    <bindings>
      <webHttpBinding>
        <binding name="TransportSecurity">
          <security mode="Transport">
            <transport clientCredentialType="None"></transport>
          </security>
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SSLBehave">
          <useRequestHeadersForMetadataAddress>
            <defaultPorts>
              <add scheme="https" port="443"/>
            </defaultPorts>
          </useRequestHeadersForMetadataAddress>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="UserManagement.ajaxAspNetAjaxBehavior">
          <webHttp defaultOutgoingResponseFormat="Json" defaultBodyStyle="Wrapped" />
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
      multipleSiteBindingsEnabled="true" />
    <services>
      <service name="UserManagement.ajax" behaviorConfiguration="SSLBehave">
        <endpoint address="" behaviorConfiguration="UserManagement.ajaxAspNetAjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="TransportSecurity" contract="UserManagement.ajax" />
      </service>
    </services>
  </system.serviceModel>
19
Snuffleupagus

Je commencerais par vérifier un certain nombre de choses;

  • Autorisations sur le répertoire hébergé?
  • La version .Net est correcte?
  • Avez-vous ajouté le certificat sur le site?
  • Essayez de mettre une image dans le même chemin, pouvez-vous y accéder (éliminer les correspondances de chemins occasionnelles)

Bonne chance!

12

J'ai eu le même problème. D'après ce que j'ai lu, l'autorisation par authentification WCF n'est pas NT (ou compatible HTTPContext) par défaut.

J'ai dû ajouter ceci à mon fichier de configuration pour le service WCF web.config dans la section:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

Ce que vous avez fait, plus ceci:

Et sur la définition de classe de service réelle, je devais ajouter:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DataService : IDataDeliveryServiceContract

Cela a résolu mon problème.

6
Jeffrey Kinzer

Peut-être dans votre fichier RouteConfig.cs, ajoutez cette ligne: 

routes.IgnoreRoute("{resource}.svc/{*pathInfo}");

Tant que votre fichier .svc se trouve à la racine de l'application.

5
Dan Leksell

Vous pouvez implémenter une sécurité au niveau du transport à l'aide de liaisons WsHttp. Voir cet article ; dans vos reliures, essayez plutôt cette option:

<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None"/>
</security>
</binding>
</wsHttpBinding>

L'article mentionne que vous devez lier les fixations avec les points finaux.

5
Only You

Comme vous l'avez mentionné, vous pouvez accéder à votre service avec l'extension .svc service.svc mais pas au format REST service.svc/AnyRequest, le problème doit être lié à routing integration

ajoutez ceci à votre web.config

 <system.webServer>
  <modules runAllManagedModulesForAllRequests="true">
    <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </modules>
  <handlers>
    <add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd"/>
  </handlers>
 </system.webServer> 

Dans le IIS 6 La cause de cette erreur doit être Check that file exists paramètre de l'extension SVC, assurez-vous que "Vérifier que le fichier existe est décoché". Pour plus d'informations, voir IIS échec du service hébergé .

4
Kambiz Shahim

La première chose que je fais chaque fois que je rencontre un 404 avec un nouveau service Web WCF est de vérifier le mappage du gestionnaire requis pour interpréter ce type d’appel, car c’est souvent la cause du problème. Il existe plusieurs façons de contourner le problème, dont la plupart nécessitent une exécution manuelle de la commande console ServiceModelReg.exe: il s'agit indubitablement de procédures valides, mais elles risquent également de ne pas fonctionner (ou de créer des problèmes supplémentaires) si votre ordinateur de développement a une configuration particulièrement complexe. La méthode de résolution que je propose ci-dessous est un peu plus longue à mettre en œuvre, mais présente l’avantage de résoudre le problème de manière plus sûre et sécurisée.

  • Ouvrez l'interface Gestionnaire de serveur pour la gestion des machines, généralement présente à la fois dans la barre des tâches et dans le menu Démarrer .
  • Accédez au Tableau de bord et sélectionnez Ajouter un rôle ou une fonctionnalité pour ouvrir l'Assistant.
  • Sélectionnez le type d'installation basée sur un rôle ou une fonctionnalité} et le serveur sur lequel vous souhaitez travailler, c'est-à-dire votre serveur local/local.
  • Accédez à la section Fonctionnalités: Une fois là-bas, développez le nœud fonctionnalités .NET Framework 3.5 et/ou le nœud fonctionnalités .NET Framework 3.5, en fonction de vos besoins. ont installé: si vous avez les deux, vous devez effectuer l’étape suivante deux fois (pour chacun d’eux).
  • Développez la section Services WCF (si disponible), puis sélectionnez Activation HTTP} _ (voir capture d'écran ci-dessous).
  • Continuez jusqu'à la fin de l'assistant, puis cliquez sur Installer.

 enter image description here

Une fois l'installation terminée, vous devriez pouvoir exécuter votre service WCF sans que l'erreur 404 ne se reproduise plus jamais.

Pour plus d'informations sur ce problème spécifique et sur la façon de le résoudre, vous pouvez également lire cet article sur mon blog.

3
Darkseal

Pour aider les autres qui se retrouvent coincés avec ceci - Il se peut que le nom de votre service ne soit pas le nom pleinement qualifié , ce qui doit être.

0
HeyJude