Pregunta

Estoy tratando de conectar Excel a un servicio WCF, pero parece que no puedo tener un caso trivial para funcionar ... obtengo un error de sintaxis no válido cuando intento crear el proxy en Excel. He adjuntado el depurador de Visual Studio a Excel, y obtuve que el error real es "interfaz no encontrada". Sé que el servicio funciona porque el cliente de prueba creado por Visual Studio está bien ... por lo que el problema está en la cadena de apodo de VBA.

Espero encontrar una de las dos cosas:

1) Una corrección a mi cadena de apodo que hará que esto funcione, o

2) Un proyecto de muestra existente para descargar que tenga la fuente tanto para el host como para el cliente que funciona.

Aquí está el código para mi 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)

Tengo el siguiente servicio:

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

Tiene el siguiente archivo de configuración:

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

Editar:

El apodo actualizado que funcionó para mí fue el siguiente

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/"""
¿Fue útil?

Solución 2

Pude solucionar esto agregando algunas citas a algunas ubicaciones clave en la cadena del apodo ... Desafortunadamente, unir el depurador a Excel le brinda retroalimentación menos que útil, por lo que arreglarlo es un ejercicio de suposición y verificación. En VBA, necesita una cita doble ("") alrededor de cada cadena en el apodo. Además, el término "MEX" en la dirección MEX debe estar capitalizado, a pesar de que especificé la dirección en el contrato como minúsculas. Imagínate.

Otros consejos

Crearía un cliente como objeto .net, lo registraría como un objeto com y accedería a él desde VBA a través de com

Actualización: encontré este artículo:http://msdn.microsoft.com/en-us/library/ms752245.aspx

Parece que para usar el apodo debe generar un cliente, y luego registrarlo con com, y luego usar su guía como su tipo, no del tipo como lo tiene.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top