Question

Je crée un comportement personnalisé pour WCF qui peut (pour des raisons d'interopérabilité) ne fonctionne correctement lorsqu'un service expose un seul critère d'application.

Je voudrais pouvoir utiliser le IServiceBehavior.Validate méthode pour vérifier qu'un seul critère 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 final de IMetadataExchange. Cela provoque la validation à l'échec des services parfaitement valides.

Ce que je besoin est un moyen de ne compter l'application critères d'évaluation (non infrastructure), mais je ne trouve pas comment WCF détermine lui-même qui sont qui.

Était-ce utile?

La solution

En travaillant autour de ce problème, je suis parvenu à reproduire le tristement célèbre:

  

'Service' service a zéro applications (terminaux non-infrastructure). Cela pourrait être parce qu'aucun fichier de configuration n'a été trouvée pour votre application, ou parce qu'aucun élément de service correspondant au nom de service n'a pu être trouvée dans le fichier de configuration, ou parce que aucun point de terminaison ont été définis 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 à levée.

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 d'évaluation considéré par l'infrastructure WCF est IMetadataExchange. Huh.

Plus vous en savez.

Autres conseils

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top