Les métadonnées WCF contiennent une référence qui ne peut pas être résolue
J'ai passé une couple d'heures à effectuer des recherches à propos de cette erreur, et je l'ai testé presque tout ce qu'il est sur Google.
Je veux accéder à un service en utilisant TCP .NET4 et VS2010, en C#.
J'Ai un très petit service:
namespace WcfService_using_callbacks_via_tcp
{
[ServiceContract(CallbackContract = typeof(ICallback), SessionMode = SessionMode.Required)]
public interface IService1
{
[OperationContract]
string Test(int value);
}
public interface ICallback
{
[OperationContract(IsOneWay = true)]
void ServerToClient(string sms);
}
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class Service1 : IService1
{
public string Test(int value)
{
ICallback the_callback = OperationContext.Current.GetCallbackChannel<ICallback>();
the_callback.ServerToClient("Callback from server, waiting 1s to return value.");
Thread.Sleep(1000);
return string.Format("You entered: {0}", value);
}
}
}
Avec le Web.config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WcfService_using_callbacks_via_tcp.Service1" behaviorConfiguration="Behaviour_Service1">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:5050/Service1" />
</baseAddresses>
</host>
<endpoint address="" binding="netTcpBinding" bindingConfiguration="DuplexNetTcpBinding_IService1" contract="WcfService_using_callbacks_via_tcp.IService1"/>
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="mexTcp" contract="IMetadataExchange"/>
</service>
</services>
<bindings>
<!--
TCP Binding
-->
<netTcpBinding>
<binding name="DuplexNetTcpBinding_IService1" sendTimeout="00:00:01"
portSharingEnabled="true">
</binding>
<binding name="mexTcp" portSharingEnabled="true">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<!--
Behaviour to avoid a rush of clients and to expose metadata over tcp
-->
<behavior name="Behaviour_Service1">
<serviceThrottling maxConcurrentSessions="10000"/>
<serviceMetadata httpGetEnabled="true"/>
</behavior>
<behavior>
<!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
<serviceMetadata httpGetEnabled="true"/>
<!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information -->
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Et ce code pour l'accueillir:
static void Main(string[] args)
{
Uri base_address = new Uri("net.tcp://localhost:5050/Service1");
ServiceHost host = null;
try
{
//Create the server
host = new ServiceHost(typeof(Service1), base_address);
//Start the server
host.Open();
//Notify it
Console.WriteLine("The service is ready at {0}", base_address);
//Allow close the server
Console.WriteLine("Press <Enter> to stop the service.");
Console.ReadLine();
//Close it
host.Close();
}
catch (Exception ex)
{
//Opus an error occurred
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(string.Format("Host error:\r\n{0}:\r\n{1}", ex.GetType(), ex.Message));
Console.ReadLine();
}finally
{
//Correct memory clean
if(host != null)
((IDisposable)host).Dispose();
}
}
Maintenant, je veux créer le client, mais je il n'est pas possible. J'ai utilisé d'Ajouter une Référence de Service et svcutil directement, mais je reçois ce message d'erreur:
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>svcutil.exe
net.tcp://loc alhost:5050/Service1 Microsoft (R) Modèle de Service
Les Métadonnées De L'Outil [Microsoft (R) Windows (R) De La Communication De La Fondation,
Version 4.0.30319.1] Copyright (c) Microsoft Corporation. Tous les droits
réservés.De la tentative de téléchargement de métadonnées à partir de
net.tcp://localhost:5050/Service1 " à l'aide de W S-Échange de Métadonnées. Cette
URL ne prend pas en charge DISCO. Microsoft (R) Modèle De Service De Métadonnées De L'Outil
[Microsoft (R) Windows (R) De La Communication De La Fondation, Version
4.0.30319.1] Copyright (c) Microsoft Corporation. Tous droits réservés.Erreur: Impossible d'obtenir les Métadonnées à partir de net.tcp://localhost:5050/Service1
Si c'est un Windows (R) de la Communication de la Fondation de service à laquelle vous
ont acce ss, veuillez vérifier que vous avez activé la publication des métadonnées
à l'addr ess. Pour obtenir de l'activation d'édition de métadonnées,
consultez le MSDN documentat ion à
http://go.microsoft.com/fwlink/?LinkId=65455.WS-Échange de Métadonnées d'Erreur
URI: net.tcp://localhost:5050/Service1De métadonnées contient une référence qui ne peut pas être résolu: net.tcp://localhost: 5050/Service1'.
La connexion de socket a été abandonnée. Cela pourrait être causé par une erreur processi ng de votre message ou de réception délai d'attente dépassé par
l'hôte distant, ou un derlying réseau de problème de ressources. Local
délai d'attente du socket était "00:04:59.9863281'.Se ha forzado la interrupción de una conexión existente por el hôte remoto
Si vous souhaitez plus d'aide, tapez "svcutil /?"
Donc, je peux héberger le service sans problèmes, mais je ne peux pas créer les procurations.
J'ai essayé presque toutes les config que j'ai trouvé, mais je pense que le web actuel.la config est correcte. Il y a les comportements, la sécurité, et les liaisons à l'aide mex, utilisé par les systèmes d'extrémité.
J'ai essayé de créer une application.config et mis dans le même dossier avec svcutil.exe.
source d'informationauteur JoanComasFdz
Vous devez vous connecter pour publier un commentaire.
Que vous êtes absent de configuration du service de
Avec cette configuration, vous ne devriez pas avoir besoin de définir l'adresse de base dans le code.
J'ai reçu le même message d'erreur lors de la tentative de mettre à jour une référence de service. Il s'avère que j'avais contrats de données avec le même nom dans le même espace de noms. Complément d'enquête a abouti à l'erreur réelle:
J'ai changé le DataContract de donner un nom à l'une des classes.
Je poste ici au cas où ça pourrait aider quelqu'un avec le même problème.
J'ai fait le même message d'erreur et il s'avère que le problème était dû à du texte dans un bloc de commentaires
Après le retrait de ces personnages de l'commenté bloc, tout fonctionne bien
J'ai eu le même problème (lorsque le client n'a pas "voir" le service "Ajouter une référence de service" menu) en utilisant uniquement la liaison tcp. Après avoir essayé d'ajouter un Comportement que j'ai eu mon service à la fin, avec une exception, car il n'a pas trouvé la bonne adresse.
Je ne sais pas si c'est la meilleure idée, mais vous pouvez ajouter la deuxième base de l'adresse http.... voici ma config et le code, il fonctionne.
Et le code
L'adresse http est maintenant usend par le client à ajouter une référence de service, et généré automatiquement config sur le côté client utilise net.protocole tcp pour appeler la fonction.
Il sera peut-être utile pour quelqu'un.
Ma question était dans un contrat argument, et je l'ai découvert avec l'aide de de l'Observateur d'Événements:
Donc, si vous avez ajouté plus d'un argument, d'avoir [MessageContract] argument, alors vous allez voir l'erreur en question. Pas du tout évident.