2010-10-25 4 views
2

Je crée un comportement personnalisé pour WCF qui ne peut (pour des raisons d'interopérabilité) fonctionner correctement que lorsqu'un service expose un point de terminaison d'application unique.Comment différenciez-vous les points de terminaison d'application et d'infrastructure?

J'aimerais pouvoir utiliser la méthode IServiceBehavior.Validate pour vérifier que seul un point d'extrémité d'application est exposé par le service. Actuellement, je fais ce qui suit:

public void Validate(
    ServiceDescription serviceDescription, 
    ServiceHostBase serviceHostBase) 
{ 
    if (serviceDescription.Endpoints.Count > 1) 
    { 
     throw new InvalidOperationException(); 
    } 
} 

serviceDescription.Endpoints contient malheureusement tous les critères d'évaluation, y compris le point de terminaison IMetadataExchange. Cela entraîne l'échec de la validation sur des services parfaitement valides. Ce dont j'ai besoin est d'un moyen de ne compter que les points de terminaison de l'application (non-infrastructure), mais je ne peux pas trouver comment WCF lui-même détermine qui sont qui.

Répondre

2

Tout en travaillant autour de ce problème, je réussi à reproduire les tristement célèbres:

'service' Service a zéro points d'extrémité d'application (non-infrastructure). Cela peut être dû au fait qu'aucun fichier de configuration n'a été trouvé pour votre application ou qu'aucun élément de service correspondant au nom de service n'a pu être trouvé dans le fichier de configuration ou qu'aucun point de terminaison n'a été défini dans l'élément de service.

Les exceptions montre une méthode EnsureThereAreNonMexEndpoints est appelée sur un objet System.ServiceModel.Description.DispatchBuilder qui fait l'exception à être jeté.

Creuser dans cette méthode avec réflecteur, j'ai la rétroingénierie la mise en œuvre suivante qui exprime la fonctionnalité équivalente:

private void EnsureThereAreNonMexEndpoints(ServiceDescription description) 
{ 
    foreach (ServiceEndpoint endpoint in description.Endpoints) 
    { 
     if (endpoint.Contract.ContractType != typeof(IMetadataExchange)) 
     { 
      return; 
     } 
    } 

    throw InvalidOperationException(); 
} 

Il semblerait que le seul critère considéré par l'infrastructure WCF est IMetadataExchange. Huh.

Plus vous en savez.

1

Je l'ai fait dans le passé comme je l'ai souligné dans ce article.

+0

Votre implémentation semble en fait aller plus loin que le WCF, vérifiant l'espace de noms WSDL ainsi que le point de terminaison Mex. –

Questions connexes