«Интерфейс не найден» в прозвище WCF без регистрации на Excel
-
24-10-2019 - |
Вопрос
Я пытаюсь подключить Excel к службе WCF, но, похоже, я не могу получить даже тривиальный случай для работы ... Я получаю ошибку неверной синтаксиса, когда пытаюсь создать прокси в Excel. Я прикрепил отладчик Visual Studio к Excel и понял, что реальная ошибка - «интерфейс не найден». Я знаю, что служба работает, потому что тестовый клиент, созданный Visual Studio, в порядке ... поэтому проблема в строке прозвища 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/"""
Решение 2
Я смог исправить это, добавив несколько кавычек в некоторые ключевые местоположения по строке прозвища ... К сожалению, прикрепление отладчика к Excel дает вам менее полезный отзыв, поэтому исправление - это упражнение в догадке и проверке. В VBA вам нужна двойная цитата ("" ") вокруг каждой строки в прозвище. Кроме того, термин «mex» в адресе MEX должен быть заглавный, хотя я указал адрес в контракте как более низкий случай. Перейти к фигуре.
Другие советы
Я бы создал клиента в качестве объекта .NET, зарегистрирует его как объект COM и получите доступ к VBA через COM
Обновление: я нашел эту статью:http://msdn.microsoft.com/en-us/library/ms752245.aspx
Похоже, что для использования прозвища вы должны генерировать клиента, а затем зарегистрировать его с Com, а затем использовать его GUID в качестве своего типа, а не тот тип, как у вас есть