Domanda

Sto cercando di connettersi Excel per un servizio WCF, ma io non riesco a ottenere anche un caso banale al lavoro ... ho un errore di sintassi non valido quando cerco di creare il proxy in Excel. Ho attaccato il debugger di Visual Studio per excel, e ottenere che il vero errore è "Interfaccia non trovata". So che il servizio funziona perché il client di prova creato da Visual Studio è ok ... quindi il problema è nella stringa moniker VBA.

Spero di trovare una delle due cose:

1) una correzione al mio stringa moniker che farà questo lavoro, o

2) un progetto di esempio esistente di download che ha la fonte sia per l'host e client che funziona.

Ecco il codice per il mio cliente 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)

Ho il seguente servizio:

[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);
    }
}

Si ha il seguente file di configurazione:

<?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>

Modifica:

Il moniker aggiornato che ha lavorato per me è stata la seguente

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/"""
È stato utile?

Soluzione 2

Sono stato in grado di risolvere questo problema con l'aggiunta di alcune citazioni ad alcune posizioni chiave sulla corda moniker ... purtroppo, allegando il debugger per Excel dà meno di un feedback utile, in modo da fissarlo è un esercizio di indovinare e controllo. In VBA, è necessario un doppio apice ( "") attorno a ciascuna stringa nel moniker. Inoltre, il termine "mex" nell'indirizzo mex deve essere in maiuscolo, anche se ho specificato l'indirizzo nel contratto come minuscole. Vai a capire.

Altri suggerimenti

I creerebbe un client come un oggetto .NET, registrarlo come un oggetto COM e accedervi da VBA tramite COM

UPDATE: Ho trovato questo articolo: http://msdn.microsoft.com/en-us /library/ms752245.aspx

Sembra che per utilizzare il moniker è necessario generare un cliente, e quindi registrarlo con COM, e quindi utilizzare il suo GUID come tipo, non il tipo, come lo avete

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top