интерфейс не найден в WCF Moniker без регистрации для excel

Я пытаюсь подключить Excel к службе WCF, но не могу заставить работать даже тривиальный случай... Я получаю сообщение об ошибке Invalid Syntax, когда пытаюсь создать прокси-сервер в excel. Я подключил отладчик Visual Studio к Excel и понял, что настоящая ошибка - «интерфейс не найден». Я знаю, что служба работает, потому что тестовый клиент, созданный визуальной студией, в порядке ... так что проблема в строке моникера VBA.

Я надеюсь найти одну из двух вещей:

1) исправление моей строки прозвища, которое заставит это работать, или

2) существующий образец проекта для загрузки, в котором есть исходный код как для хоста, так и для клиента, который действительно работает.

Вот код для моего клиента 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)

У меня есть следующий сервис:

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

Он имеет следующий файл конфигурации:

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

Редактировать:

Обновленный прозвище, которое сработало для меня, было следующим

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/"""

person tbischel    schedule 03.06.2010    source источник
comment
Та же ошибка также возникает, когда служба WCF предоставляет методы с непримитивными типами в качестве параметров или возвращаемых типов.   -  person ssgonell    schedule 08.11.2011


Ответы (2)


Я бы создал клиента как объект .NET, зарегистрировал его как COM-объект и получил к нему доступ из VBA через COM.

ОБНОВЛЕНИЕ: я нашел эту статью: http://msdn.microsoft.com/en-us/library/ms752245.aspx

Кажется, что для использования моникера вам нужно сгенерировать клиента, а затем зарегистрировать его в COM, а затем использовать его GUID в качестве вашего типа, а не типа, который у вас есть.

person Joon    schedule 03.06.2010
comment
в то время как это еще один способ установить соединение, суть в том, чтобы научиться делать это способом WCF... но получить базовый уровень для работы - person tbischel; 04.06.2010
comment
Я использую контракт на обмен метаданными. Я работал со статьей, на которую вы уже ссылались... обратите внимание на раздел «Контракт на обмен метаданными». - person tbischel; 07.06.2010

Я смог исправить это, добавив несколько кавычек в некоторые ключевые места в строке моникера... к сожалению, присоединение отладчика к Excel дает малополезную обратную связь, поэтому его исправление требует догадок и проверок. В VBA вам нужна двойная кавычка ("") вокруг каждой строки моникера. Кроме того, термин «мекс» в адресе мекс должен быть написан с заглавной буквы, даже несмотря на то, что я указал адрес в контракте в нижнем регистре. Иди разберись.

person tbischel    schedule 07.06.2010
comment
Не возражаете ли вы обновить / отредактировать свой исходный пост, чтобы отразить внесенные вами изменения, которые сработали для вас? Я испытываю ту же проблему и пробовал то, что вы изменили. - person Ben.Vineyard; 17.06.2010