Question

Je suis en train de se connecter Excel à un service WCF, mais je ne peux pas sembler obtenir même un cas trivial au travail ... Je reçois une erreur de syntaxe non valide quand je tente de créer le proxy dans Excel. J'ai joint le débogueur studio visuel pour Excel, et obtenir que l'erreur réelle est « interface pas trouvé ». Je sais que le service fonctionne parce que le client de test créé par le studio visuel est ok ... donc le problème dans la chaîne de VBA sobriquet.

J'espère 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 client qui fonctionne.

Voici le code VBA pour mon client:

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>

Edit:

Le sobriquet mis à jour qui a fonctionné pour moi a été comme suit

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/"""
Était-ce utile?

La solution 2

J'ai pu résoudre ce problème en ajoutant quelques citations à certains endroits clés sur la chaîne ... malheureusement sobriquet, attacher le débogueur à Excel vous donne moins de commentaires utiles, donc le fixer est un exercice de deviner et vérifier. Dans VBA, vous avez besoin d'un guillemet ( « ») autour de chaque chaîne dans le sobriquet. De plus, le terme « MEX » dans l'adresse doit être capitalisé MEX, même si je spécifié l'adresse dans le contrat comme des minuscules. Go figure.

Autres conseils

Je voudrais créer un client comme un objet .NET, inscrivez-vous comme un objet COM et y 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top