2010-06-03 19 views
0

J'essaye de me connecter à Excel à un service WCF, mais je n'arrive même pas à faire fonctionner un cas trivial ... J'ai une erreur de syntaxe invalide quand j'essaie de créer le proxy dans Excel. J'ai attaché le débogueur visuel de studio pour exceler, et obtenir que la vraie erreur est "l'interface non trouvée". Je sais que le service fonctionne parce que le client de test créé par Visual Studio est correct ... donc le problème est dans la chaîne moniker VBA."interface introuvable" dans WCF Moniker sans inscription pour excel

Je suis l'espoir de trouver une des deux choses:

1) une correction à ma chaîne de sobriquet qui fera ce travail, ou

2) un exemple de projet existant télécharger qui a la source pour l'hôte et le client qui fonctionne.

Voici le code pour mon client VBA:

Dim addr As String 
addr = "service:mexAddress=net.tcp://localhost:7891/Test/WcfService1/Service1/mex, " 
addr = addr + "address=net.tcp://localhost:7891/Test/WcfService1/Service1/, " 
addr = addr + "contract=IService1, contractNamespace=http://tempuri.org, " 
addr = addr + "binding=NetTcpBinding_IService1, bindingNamespace=""http://tempuri.org""" 

MsgBox (addr) 

Dim service1 As Object 
Set service1 = GetObject(addr) 

MsgBox service1.Test(12) 

J'ai le service suivant:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    string GetData(int value); 
} 

public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

Il a le fichier de configuration suivante:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 

    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
    <!-- When deploying the service library project, the content of the config file must be added to the host's 
    app.config file. System.Configuration does not support config files for libraries. --> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="WcfService1.Service1Behavior" 
     name="WcfService1.Service1"> 
     <endpoint address="" binding="netTcpBinding" bindingConfiguration="" 
      contract="WcfService1.IService1"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://localhost:7891/Test/WcfService1/Service1/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WcfService1.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

</configuration> 

Editer:

Le sobriquet mis à jour qui a fonctionné pour moi était la suivante

Dim addr As String 
addr = "service:mexAddress=""net.tcp://localhost:7891/Test/WcfService1/Service1/Mex"", " 
addr = addr + "address=""net.tcp://localhost:7891/Test/WcfService1/Service1/"", " 
addr = addr + "contract=""IService1"", contractNamespace=""http://tempuri.org/"", " 
addr = addr + "binding=""NetTcpBinding_IService1"", bindingNamespace=""http://tempuri.org/""" 
+0

La même erreur se produit également lorsqu'un service WCF expose des méthodes avec des types non-primitifs en tant que paramètres ou types de retour. – ssgonell

Répondre

0

J'ai été capable de résoudre ce problème en ajoutant des guillemets à certains emplacements clés de la chaîne moniker ... malheureusement, attacher le débogueur à Excel vous donne moins de retour utile, donc la corriger est un exercice de conjecture. Dans VBA, vous avez besoin d'un double guillemet ("") autour de chaque chaîne du surnom. De plus, le terme «mex» dans l'adresse mex doit être capitalisé, même si j'ai spécifié l'adresse dans le contrat en minuscules. Allez comprendre.

+1

Cela vous dérange-t-il de mettre à jour/modifier votre publication originale pour refléter les changements que vous avez faits qui ont fonctionné pour vous? Je rencontre le même problème et j'ai essayé les choses que vous avez changé. –

+1

mis à jour le poste avec les modifications que j'ai faites. – tbischel

0

Je voudrais créer un client comme un objet .NET, inscrivez-vous comme un objet COM et accéder à partir de VBA via COM

MISE À JOUR: Je trouve cet article: http://msdn.microsoft.com/en-us/library/ms752245.aspx

il semble que d'utiliser le sobriquet que vous devez générer un client, puis l'enregistrer avec COM, puis utilisez le GUID comme type, pas le type que vous avez

+0

alors que c'est une autre façon d'établir une connexion, le point essaie d'apprendre à le faire à la manière de la WCF ... mais de faire fonctionner une base de référence – tbischel

+0

J'utilise un contrat d'échange de métadonnées. J'ai travaillé à partir de l'article que vous avez déjà lié ... Notez la section "Contrat d'échange de métadonnées". – tbischel