EndpointNotFoundException sur appel de fonctionnement de l'exécution Reposant service WCF
J'ai un étrange problème avec une de mes services WCF. Je suis assez sûr que la plupart des gens qui ont expérimenté avec des services WCF ont eu un EndpointNotFoundException
jeté lors d'un point de terminaison n'avait pas été correctement défini dans l'une de leurs fichiers de configuration. À partir de la EndpointNotFoundException
de la classe page sur MSDN:
L'exception est levée lors d'un point de terminaison distant n'a pas pu être trouvé ou atteint.
Plus loin, il poursuit:
Le point de terminaison ne peut pas être trouvé ou accessible car le point de terminaison distant est en bas, le point de terminaison distant est inaccessible, ou parce que la distance le réseau est inaccessible.
Cela ne pas réfléchir à ma situation. Il semble donc que la réception d'un EndpointNotFoundException
lorsque l'on travaille avec WCF est pas inhabituel, mais ce Exception
est pas levée lorsque première la tentative d'accès au service... au lieu de cela, il est jeté uniquement lorsque vous essayez d'appeler l'une des activités du service:
using (ExportConfirmationServiceClient client = new ExportConfirmationServiceClient(
"WebHttpBinding_IExportConfirmationService")) //<-- Exception is NOT thrown here
{
...
component releaseConfirmation = DeserializeTestXmlFile(filePath);
client.AddExportConfirmation("5051275066302", releaseConfirmation);
//Exception is thrown on call to service operation on line above
...
}
Fait intéressant, le Exception
message contient également le nom de l'opération dans le fichier chemin d'accès:
Il n'y a pas de point de terminaison de l'écoute à
http://domain/Folder/ServiceName.svc/OperationName
que peut accepter le message. Cela est souvent causé par une mauvaise adresse ou du SAVON d'action. Voir InnerException, le cas échéant, pour plus de détails.
L'intérieur Exception
a le message suivant:
Le serveur distant a retourné une erreur: (404) Pas Trouvé.
C'est particulièrement déroutant pour moi comme je l'ai peut parcourir avec succès à l'URL du service et de voir la valeur par défaut Vous avez créé un service page:
Aussi, si je parcourir le chemin dans le Exception
message, je vois un Endpoint pas trouvé message sur la page:
Cependant, si je navigue à toute opération de page d'un de mes autres, le travail des services WCF, je reçois un standard 400 Bad Request
d'erreur à partir du navigateur, même si l'opération fonctionne très bien. Donc, il me semble que si cet original EndpointNotFoundException
pourrait être un hareng rouge... je suis vraiment pas sûr de bien, comme je n'ai pas passé beaucoup de temps à travailler avec WCF.
Je vais vous montrer mon web.config (côté serveur) ici au cas où quelqu'un a besoin de le voir:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="Midas.WebConfirmations.ExportConfirmationServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" />
<services>
<service name="Midas.WebConfirmations.ExportConfirmationService" behaviorConfiguration="Midas.WebConfirmations.ExportConfirmationServiceBehaviour">
<endpoint address="" binding="webHttpBinding" contract="Midas.WebConfirmations.IExportConfirmationService" behaviorConfiguration="webHttp" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
C'est le client App.config
(gardez à l'esprit que cela fait référence à deux services WCF):
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IDataService" 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="None">
<transport clientCredentialType="None" proxyCredentialType="None" realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
<webHttpBinding>
<binding name="WebHttpBinding_IExportConfirmationService" allowCookies="true" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000">
<readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="Midas.WebConfirmations.ExportConfirmationServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webEndpointBehavior">
<webHttp defaultBodyStyle="Wrapped" defaultOutgoingResponseFormat="Xml" helpEnabled="true"/>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="http://devbucket.ministryofsound.mos.local/MidasWebServices/DataService.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IDataService" contract="Midas.WebServiceClients.IDataService" name="BasicHttpBinding_IDataService" />
<endpoint address="http://devbucket.ministryofsound.mos.local/MidasWebConfirmations/ExportConfirmationService.svc" binding="webHttpBinding" bindingConfiguration="WebHttpBinding_IExportConfirmationService" behaviorConfiguration="webEndpointBehavior" contract="IExportConfirmationService" name="WebHttpBinding_IExportConfirmationService" />
</client>
</system.serviceModel>
</configuration>
Donc si l'un des grands esprits qui fréquente de Débordement de Pile pourrait jeter quelque lumière sur ce problème pour moi, j'en serais très heureux.
Mise à JOUR >>>
En réponse à la première quelques commentaires, je soupçonne que le problème pourrait être causé par une Exception
être levée à partir du serveur de code, donc j'ai simplifié le code d'opération de façon spectaculaire... maintenant il fait cela, mais j'obtiens toujours la même erreur:
public void AddExportConfirmation(string upc, component ingestionFeedback)
{
WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.OK;
}
Aussi, je ne définir le traçage, mais il n'a travaillé que sur le côté client, donc il m'a seulement dit ce que je savais déjà. Je vais regarder le lien que vous avez fourni @BigDaddy, dans le cas où il montre comment mettre en place le suivi sur le côté serveur.
En réponse à Tewr, j'ai généré le service client à l'aide de svcutil.exe
, mais j'ai aussi essayé d'ajouter une référence de service et laisser Visual Studio crée la référence pour moi... les deux méthodes ont abouti à la même erreur. Aussi, j'ai fait la mise à jour des références de service toute la journée, comme je l'ai été de faire des changements. Le includeExceptionDetailInFaults="true"
paramètre n'a fait aucune différence, mais je vais essayer d'ajouter une opération fictive pour le service et essayez de l'afficher dans le navigateur.
Mise à JOUR 2 >>>
Ok, j'ai donc ajouté une simple méthode de lecture pour le service et mis à jour les références de toutes les rondes comme @Tewr suggéré. Cela a fait de moi plus confus... la méthode:
[XmlSerializerFormat()]
[OperationContract]
[WebGet()]
string GetString();
La mise en œuvre renvoie simplement un string
et je vois que la valeur quand je accéder au service dans un navigateur web:
Cependant, je encore obtenir la même erreur de code, même lors de l'appel de cette même nouvelle opération... ça veut dire quoi?
Mise à JOUR 3 >>>
Après avoir pris l'avis des commentaires, j'ai mis en place un Service de suivi dans le service de nouveau... je n'ai toujours pas d'obtenir un travail sur le serveur, mais sur le client, il n'a sortie un fichier de trace. Dans ce fichier, je vois un InvalidOperationException
avec le message suivant:
Enveloppe Version " EnvelopeNone ( http://schemas.microsoft.com/ws/2005/05/envelope/none ) ne prend pas en charge l'ajout d'en-Têtes de Message.
Je suis juste à la recherche de cette maintenant, donc si vous savez ce que cette erreur, s'il vous plaît laissez-moi savoir.
- Si vous ne l'avez pas déjà fait, configurez le suivi pour voir ce qui se passe réellement. Suivez ceci: stackoverflow.com/questions/14217700/...
- Votre hareng rouge théorie est valide...j'ai eu la même exception avant, mais la réalité était une exception non gérée du côté service. Le consommateur a donné et a jeté l'exception générale. Débogage de l'autre extrémité.
- On dirait que vous utilisez un générés serviceclient. Avez-vous modifié l'interface de service récemment, et peut-être oublié de mettre à jour la référence de service? Aussi, je vois de votre aide webHttp de liaison, cela vous permet de vérifier vos mappages en utilisant simplement votre navigateur. Créer un mannequin fonction de votre service
[WebGet(UriTemplate = "Ping/")] bool Ping() { return true; }
et tentez d'y accéder à partir d'un navigateur.. Dernier conseil,includeExceptionDetailInFaults="true"
peut vous aider. - Mise à JOUR 1: Activation du traçage devrait vous aider. Il m'a aidé. Et il peut être appliqué sur Côté Serveur en tant que bien. Essayez de changer ces: <trace autoflush="false" /> et initializeData= "D:\Log\Traces.svclog"> Ajouter le chemin d'accès complet à "initializeData".
- Que votre mannequin fonctionne, l'erreur est moins probable d'être sur le serveur. Votre application cliente.config semble ok pour moi, un coup d'œil. Dans ce cas, je serais le feu jusqu'à Fiddler et de comparer les en-têtes ou de l'url simple, navigateur téléphonique avec l'un de vos .net client. Que votre intérieur exception est une erreur 404 lors de l'utilisation de l' .net client, votre .net client n'a probablement quelque chose de funky avec le fonctionnement de l'url.
- Essayez de redémarrer tout le Net.Les services TCP... qui s'est avéré pour résoudre mon problème
Vous devez vous connecter pour publier un commentaire.
Le problème avec WCF est que c'est tellement complexe, la
Exception
s couvrir de nombreux différentes erreurs de chacun et de l'Exception
messages sont tellement vagues. De mon expérience limitée, il semble être un message d'erreur dirai une chose, mais il va souvent être en totalité ou en partie sans rapport avec votre problème. J'ai donc gardé la correction des erreurs, qui a débloqué de nouveauxExceptions
(et je encore ne sont pas venus à la fin de leur encore!), mais pour les fins de cette question, il est une réponse.Donc il s'est avéré que l'original
EndpointNotFoundException
était fait levée, car il y avait un non géréeException
dans leAddExportConfirmation
service à la méthode de la mise en œuvre. Une fois, j'ai simplifié le code (comme dans la première question de mise à jour), ceException
a disparu et a été remplacé par le suivant.