49 votes

Pourquoi ce n'est pas ma coutume WCF comportement extension type d'élément trouvé?

J'ai une solution qui contient deux projets. Un projet est un ASP.NET Projet d'Application Web, et l'autre est une bibliothèque de classe. L'application web a un projet de référence pour la bibliothèque de classe. Aucune de ces est fortement nommé.

Dans la bibliothèque de classe, que je vais appeler "Cadre de," je avoir un comportement de point de terminaison (un IEndpointBehavior mise en œuvre) et un élément de configuration (une classe dérivée de BehaviorExtensionsElement). L'élément de configuration est si je peux joindre le comportement de point de terminaison à un service via la configuration.

Dans l'application web, j'ai un AJAX service WCF. Dans le web.config, j'ai l'AJAX de service configuré pour utiliser mon comportement personnalisé. Le système.serviceModel section de la configuration est assez classique et ressemble à ceci:

<system.serviceModel>
 <behaviors>
  <endpointBehaviors>
   <behavior name="MyEndpointBehavior">
    <enableWebScript />
    <customEndpointBehavior />
   </behavior>
  </endpointBehaviors>
 </behaviors>
 <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
 <services>
 <service name="WebSite.AjaxService">
  <endpoint
           address=""
           behaviorConfiguration="MyEndpointBehavior"
           binding="webHttpBinding"
           contract="WebSite.AjaxService" />
  </service>
 </services>
 <extensions>
  <behaviorExtensions>
   <add
       name="customEndpointBehavior"
       type="Framework.MyBehaviorExtensionsElement, Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
  </behaviorExtensions>
 </extensions>
</system.serviceModel>

Au moment de l'exécution, cela fonctionne parfaitement. L'AJAX service WCF utilise correctement mes personnalisé configuré comportement de point de terminaison.

Le problème est que lorsque j'essaie d'ajouter une nouvelle AJAX service WCF. Si je dois Ajouter -> Nouvel Élément... et sélectionnez "AJAX Service WCF," je peux le regarder ajouter l' .svc fichier et le code-behind, mais quand il arrive à la mise à jour sur le web.fichier de config, j'ai cette erreur:

Le fichier de configuration n'est pas valide d'un fichier de configuration pour le Service WCF Bibliothèque.

Le type de Cadre.MyBehaviorExtensionsElement, Framework, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null', enregistré pour l'extension 'customEndpointBehavior' n'a pas pu être chargé.

Évidemment, la configuration est tout à fait valable, car il fonctionne parfaitement lors de l'exécution. Si je supprime l'élément de mon comportement de configuration temporaire, puis ajouter l'AJAX Service WCF, tout se passe sans accroc.

Malheureusement, dans un projet plus vaste où nous aurons de multiples services avec différentes configurations, de supprimer tous les comportements personnalisés temporairement va être sujettes à erreur. Alors que je me rends compte que je pouvais aller sans l'aide de l'assistant et de tout faire manuellement, tout le monde ne peut, et il serait agréable d'être en mesure d'utiliser le produit comme il est destiné à être utilisé - assistants et tous.

Pourquoi ce n'est pas ma coutume WCF comportement extension type d'élément trouvé?

Mises à jour/précisions:

  • Il fonctionne au moment de l'exécution, tout simplement pas le temps de conception.
  • Le Cadre de l'assemblée est dans le web dossier bin du projet lorsque je tente d'ajouter le service.
  • Alors que je pouvais ajouter des services manuellement ("sans configuration"), j'ai besoin de l'out-of-the-box modèle d'élément de travail - c'est le but de la question.
  • Ce problème est d'être vu dans Visual Studio 2008. Dans VS 2010, ce qui semble être résolu.

J'ai déposé cette question sur Microsoft Connect, et il s'avère que vous avez de mettre votre configuration personnalisée de l'élément dans le cas ou le mettre dans l'IDE dossier. Ils ne seront pas en la fixant, au moins pour l'instant. J'ai posté la solution qu'ils ont fournis comme la "réponse" à cette question.

22voto

Travis Illig Points 6435

Par la solution de contournement que Microsoft a publié sur la question de connexion , j'ai déposé pour cela, c'est un problème connu et il n'y aura pas de solution pour elle, au moins dans la version actuelle:

La raison pour ne pas en ajouter un nouveau le poste de service: Lors de l'ajout d'un nouvel élément et de mettre à jour le fichier de configuration, le système va essayer de charger le fichier de configuration, donc il va essayer de rechercher et charger l'assemblée de l' cusom extension de ce fichier de configuration. Seulement dans le cas que l'assemblée est GACed ou est situé dans le même chemin comme vs exe (Program Files\Microsoft Visual Studio 9.0\Common7\IDE), le le système peut en trouver. Sinon, l' boîte de dialogue d'erreur s'affiche et "ajouter un un nouvel élément" échouent.

Je comprends vos points de douleur. Malheureusement nous ne pouvons pas prendre cette changements dans la version actuelle. Nous allons enquêter dans les versions ultérieures et essayez de fournir une meilleure solution puis,comme la prestation d'un dialogue parcourir pour permettre aux clients de spécifier le chemin d'accès, ou mieux, un message d'erreur indiquer quelques travaux autour de la solution, etc...

Pouvez-vous essayer de le contourner en courant stade: GAC votre extension personnalisée de l'assemblée ou de la copier au "Programme Files\Microsoft Visual Studio 9.0\Common7\IDE"?

Nous allons fournir le fichier readme pour aider les autres clients qui peuvent s'exécuter dans le même problème.

Malheureusement, il semble que je suis hors de la chance sur ce coup.

8voto

Clark Kent Points 5845

Les gars j'ai trouvé la solution pour vous!!!

J'ai juste utilisé

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyVersion("1.0.0.0")]
//[assembly: AssemblyFileVersion("1.0.0.0")] 

Donc, j'ai une nouvelle assemblée numéro de version à chaque fois.

Mais nous avons

   <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

Version=1.0.0.0 C'EST FAUX!!!

Si vous avez 2 options

  1. De retour à

    //[assembly: AssemblyVersion("1.0.*")] 
    [assembly: AssemblyVersion("1.0.0.0")]  Keep it manually.
    [assembly: AssemblyFileVersion("1.0.0.0")] 
    
  2. Chaque génération remplacer manuellement Version=1.0.0.0 , avec un nombre correct.

Ça y est!! :)

8voto

cdmdotnet Points 484

Comme un avis de quelqu'un qui bute sur ce ces jours-ci une solution possible est d'obtenir votre assemblée dans votre application.config/web.config. Par exemple si vous avez eu

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="clientCredential" type="Client.ClientCredentialElement, Client" />
        </behaviorExtensions>
    </extensions>

essayez - en remplaçant les valeurs que necassary

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="clientCredential" type="Client.ClientCredentialElement, Client, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
        </behaviorExtensions>
    </extensions>

cette solution a fonctionné pour moi.

4voto

Derek Atlansky Points 41

J'ai essayé cela avec un nouveau projet juste pour s'assurer qu'il n'était pas à votre projet/config et a eu exactement le même problème.

À l'aide de la fusion des journaux, il semble que le système recherche le comportement des extensions dans le répertoire IDE (C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE). La copie de l'assemblée à ce répertoire dans une étape de post-construction fonctionne, mais c'est laid.

2voto

James Bender Points 596

Avez-vous une copie de Framework.dll avec votre comportement personnalisé dans le répertoire bin de votre projet web? Si pas c'est probablement le problème. Visual Studio est à la recherche pour la mise en œuvre du comportement. Depuis qu'il est indiqué dans votre config il ne pense pas à la regarder dans les autres projets; il s'attend à trouver l'assemblée à la poubelle.

Tout dépend de votre projet d'installation, il peut être en mesure d'exécuter dans le debug sans cette assemblée d'être mis à la poubelle, bien que VS généralement construit et met là. Mais encore une fois, cela dépend de la façon dont les choses sont de l'installation.

De toute façon, pourriez juste voulez vérifier que le montage est disponible au moment de la conception.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X