2016-10-24 1 views
0

Création d'un module complémentaire Autodesk Revit. Je souhaite qu'il soit en mesure de parler aux services Web SOAPRevit Addin Visual Studio Appel du service Web SOAP

L'addin est créé en tant que bibliothèque de classes. Le code client SOAP est généré à l'aide de Visual Studio Service Reference et pointant vers l'URL wsdl.

Quand je lance le Addin de Revit je reçois l'erreur suivante

Revit a rencontré un System.InvalidOperationException: Impossible de trouver l'élément point final avec le nom « {xxx} » et contrat « {yyy} » dans le client ServiceModel section de configuration.

Notez que les appels SOAP fonctionnent correctement si je crée le projet Visual Studio en tant que projet de ligne de commande et l'exécutez directement.

Remarque2 le dossier de construction que je désigne dans le manifeste addin contient un fichier .config.

<?xml version="1.0" encoding="utf-8" standalone="no"?> 
<RevitAddIns> 
    <AddIn Type="Command"> 
<Name>AIMRevitTestTwo</Name> 
<Assembly> 
    C:\Users\greg.bluntzer\Documents\Visual Studio 2015\Projects\AIMRevitTestTwo\AIMRevitTestTwo\bin\Debug\AIMRevitTestTwo.dll 
</Assembly> 
<AddInId>604b1052-f742-4951-8576-c261d1993109</AddInId> 
<FullClassName>App</FullClassName> 
<VendorId>xxx</VendorId> 
<VendorDescription>yyy</VendorDescription> 

Y at-il autre chose que je dois configurer dans mon projet Visual Studio ou Manifest Revit afin qu'il se penchera sur le fichier .config.

Mise à jour: J'ai trouvé ce link Cela dit pour essayer de créer/mettre à jour le fichier revit.exe.config et ajouter les liaisons à cela. Il résout mon problème localement. Ce n'est pas une bonne solution pour moi car je veux distribuer cet addin. Donc je voudrais toujours savoir comment créer l'addin afin qu'il puisse lire le fichier de configuration fourni avec la bibliothèque de classes.

SOLUTION: comme le suggère je construis les informations de configuration dans le code

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

Active en

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.Default; 
     binding.MaxReceivedMessageSize = int.MaxValue; 
     binding.MaxBufferSize = int.MaxValue; 

     EndpointAddress endPointAddress = new EndpointAddress(DataAccess.END_POINT); 

Répondre

1

En général, la meilleure réponse dans mon expérience est de créer vos fixations par programme, plutôt que un fichier de configuration. Si vous regardez le constructeur de votre classe client SOAP auto-générée, il a un constructeur sans argument que vous utilisez probablement (qui lit à partir de la configuration) - mais il y en a probablement un autre où vous spécifiez l'adresse et la liaison dans le code. Allez cette route. Découvrez quelque chose comme la classe BasicHttpBinding. Tout ce qui est spécifié dans la configuration peut être ajouté à cette classe dans le code.

+0

Ca l'a fait merci –