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>
Je commencerais par vérifier un certain nombre de choses;
Bonne chance!
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.
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.
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.
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é .
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.
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.
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.