Добавление Revit в Visual Studio, вызывающее веб-службу SOAP

#c# #visual-studio #autodesk #revit-api

#c# #visual-studio #autodesk #revit-api

Вопрос:

Создание дополнения Autodesk Revit. Я хочу, чтобы он мог взаимодействовать с веб-службами SOAP

Дополнение создается как библиотека классов. Клиентский код SOAP генерируется с использованием ссылки на службу Visual Studio и указания на URL-адрес wsdl.

Когда я запускаю дополнение из Revit, я получаю следующую ошибку

Revit столкнулся с системой.Исключение InvalidOperationException: не удалось найти элемент конечной точки с именем ‘{xxx}’ и контрактом ‘{yyy}’ в разделе конфигурации клиента ServiceModel.

Примечание1, что вызовы SOAP работают нормально, если я создаю проект Visual Studio как проект командной строки и запускаю его напрямую.

Примечание2 в папке сборки, на которую я указываю в манифесте добавления, есть файл .config.

 <?xml version="1.0" encoding="utf-8" standalone="no"?>
<RevitAddIns>
  <AddIn Type="Command">
<Name>AIMRevitTestTwo</Name>
<Assembly>
  C:Usersgreg.bluntzerDocumentsVisual Studio 2015ProjectsAIMRevitTestTwoAIMRevitTestTwobinDebugAIMRevitTestTwo.dll
</Assembly>
<AddInId>604b1052-f742-4951-8576-c261d1993109</AddInId>
<FullClassName>App</FullClassName>
<VendorId>xxx</VendorId>
<VendorDescription>yyy</VendorDescription>
  

Есть ли что-то еще, что мне нужно настроить в моем проекте Visual Studio или манифесте Revit, чтобы он просматривал файл .config.

Обновление: я нашел эту ссылку, в которой говорится, что нужно попытаться создать / обновить файл revit.exe.config и добавить к нему привязки. Это решает мою проблему локально.Для меня это не очень хорошее решение, поскольку я хочу распространять это дополнение. Итак, я все еще хотел бы знать способ создания дополнения, чтобы оно могло читать конфигурационный файл, который поставляется с библиотекой классов.

РЕШЕНИЕ: как и предлагалось, я создаю информацию о конфигурации в коде

          <binding name="findAePReqEByDocumentSoapBinding"  allowCookies="true">
              <security mode="TransportCredentialOnly">
                <transport clientCredentialType="Basic" proxyCredentialType="Basic" realm="fmax" />
                <message clientCredentialType="UserName" algorithmSuite="Default" />
              </security>
            </binding>
  

Превращается в

 BasicHttpBinding binding = new BasicHttpBinding();
        binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
        binding.AllowCookies = true;
        binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
        binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Basic;
        binding.Security.Transport.Realm = "fmax";
        binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
        binding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Defau<
        binding.MaxReceivedMessageSize = int.MaxValue;
        binding.MaxBufferSize = int.MaxValue;

        EndpointAddress endPointAddress = new EndpointAddress(DataAccess.END_POINT);
  

Ответ №1:

Как правило, по моему опыту, лучшим решением является создание ваших привязок программно, а не с помощью файла конфигурации.

Если вы посмотрите на конструктор для вашего автоматически сгенерированного клиентского класса SOAP, у него есть конструктор без аргументов, который вы, вероятно, используете (который считывается из конфигурации), но, вероятно, есть другой, где вы указываете адрес и привязку в коде. Идите этим путем. Проверьте что-то вроде класса BasicHttpBinding. Все, что указано в конфигурации, может быть добавлено к этому классу в коде.