Question

Ceci est une question similaire que celui-ci:   Win32Exception @ ServiceHost.Open () de service WCF.

J'ai une machine qui est très lent sur l'appel ServiceHost.Open ci-dessous. Il faut toujours 7 secondes environ pour ouvrir le service, à chaque fois. Cette machine est ma boîte à la maison, et il est pas une partie d'un domaine.

Je peux exécuter le même code sur une autre boîte (ma boîte de travail) qui est une partie d'un domaine et l'hôte de service s'ouvre dans environ 3-4 secondes sur le premier appel, mais si je cours le programme de nouveau l'hôte de service ouvre en environ 1 seconde ou moins.

J'ai travaillé avec le soutien MS à ce sujet, et nous les journaux de trace générés et la partie, il est suspendu dans est l'endroit où est sort et tente de se connecter à un domaine, même sur la machine qui ne fait pas partie d'un domaine. Et il obtient le « Le domaine spécifié n'existe pas ou n'a pas pu être contacté. » exception dans le journal de suivi, et c'est là tout le temps se Rongé.

Mais ce qui est vraiment étrange est que même sur ma machine de travail, si je ne suis pas connecté à un domaine (comme si je ne suis pas sur mon réseau de travail et juste courir à la maison) Je reste ne pas obtenir le délai.

Je reconstruit ma machine sous Windows 7 64 bits, et le même comportement se produit (XP SP3 a été en cours d'exécution, que je restaurée lorsque Windows 7 ne semble pas résoudre le problème).

Je me demandais si quelqu'un avait une idée de ce qui pourrait provoquer ce problème. Soit dit en passant, si je désactiver le « Client pour les réseaux Microsoft », le temps est comme 4 secondes pour ouvrir le ServiceHost, mais qui est toujours pas aussi vite que cette machine utilisée pour être en mesure d'ouvrir le service. D'une certaine façon, il pense qu'il est censé faire partie d'un domaine ou quelque chose.

    static void RunServiceWithinEXE()
    {
        Uri baseAddress = new Uri("http://localhost:11111/Demo");
        ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService), baseAddress);

        try
        {
            // Add a service endpoint
            serviceHost.AddServiceEndpoint(
                typeof(ICalculator),
                new WSHttpBinding(),
                "CalculatorService");

            // Enable metadata exchange
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            serviceHost.Description.Behaviors.Add(smb);
            serviceHost.Opening += new EventHandler(serviceHost_Opening);
            serviceHost.Opened += new EventHandler(serviceHost_Opened);
            serviceHost.Open();
            Console.WriteLine("The service is ready.");

            // Close the ServiceHostBase to shutdown the service.
            serviceHost.Close();
        }
        catch (CommunicationException ce)
        {
            Console.WriteLine("An exception occured: {0}", ce.Message);
            serviceHost.Abort();
        }
    }

    static void serviceHost_Opened(object sender, EventArgs e)
    {
        TimeSpan timeToOpen = DateTime.Now - shOpening;
        Console.WriteLine("Time To Open: :" + timeToOpen.Seconds);
    }

    static void serviceHost_Opening(object sender, EventArgs e)
    {
        shOpening = DateTime.Now;
    }

Voici mon app.config, mais je n'ai pas les paramètres de configuration de sécurité spéciale pour le service là-bas, seuls certains paramètres de diagnostic pour permettre la trace WCF.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <diagnostics>
            <messageLogging maxMessagesToLog="30000"
                    logEntireMessage="true"
                    logMessagesAtServiceLevel="false"
                    logMalformedMessages="true"
                    logMessagesAtTransportLevel="true">
                <filters>
                    <clear/>
                </filters>
            </messageLogging>
        </diagnostics>
    </system.serviceModel>

    <system.diagnostics>
        <sources>
            <source name="System.ServiceModel" switchValue="Warning, ActivityTracing" propagateActivity="true" >
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
            <source name="System.ServiceModel.MessageLogging" switchValue="Warning">
                <listeners>
                    <add name="xml" />
                </listeners>
            </source>
        </sources>
        <sharedListeners>
            <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\Temp\Server.svclog" />
        </sharedListeners>
        <trace autoflush="true" indentsize="4">
            <listeners>
                <remove name="Default" />
                <add name="ScottsConsoleListener" type="System.Diagnostics.ConsoleTraceListener" />
                <add name="ScottsTextListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Temp\DebugLog.txt" />
            </listeners>
        </trace>
    </system.diagnostics>
</configuration>

Notez également que ma définition de service a SessionMode nécessaire (voir ci-dessous). Si je prends l'exigence de SessionMode, je ne reçois pas les retards.

using System;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace Microsoft.ServiceModel.Samples
{
    // Define a service contract.
    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples", SessionMode = SessionMode.Required)]
    public interface ICalculator
    {
        [OperationContract]
        double Add(double n1, double n2);

        [OperationContract]
        double Subtract(double n1, double n2);

        [OperationContract]
        double Multiply(double n1, double n2);

        [OperationContract]
        double Divide(double n1, double n2);

        [OperationContract]
        string PrintName(string firstName, string lastName);

        [OperationContract]
        Point MakePoint(double x, double y);

    }
}
Était-ce utile?

La solution 2

Il se trouve que si je désactive netbios sur mes connexions réseau, je ne reçois pas les retards sur les appels ServiceHost.Open. Je ne sais pas pourquoi, mais cela semble résoudre le problème.

Ce qui est étrange est que quand je fait une installation propre de XP, je n'ai pas eu les retards même avec le Netbios activé, donc je ne sais pas pourquoi il arrive avec mon installation existante (je ne l'installation propre sur ce même machine, puis restauré ma sauvegarde à partir d'une image pour exécuter ces tests).

Autres conseils

D'accord, je soupçonne le fait que vous utilisez une fixation (WsHttpBinding) qui par défaut l'authentification de ses appelants à l'aide de données d'identification Windows à moins que vous dire spécifiquement pas.

Dans votre code d'hébergement de service, vous êtes juste instancier une instance par défaut WsHttpBinding - aucun paramètre dans config ou un code pour modifier le comportement de sécurité par défaut, dans ce cas,

.

Juste des fins de test: essayez de changer votre code d'hébergement de services à:

 // Add a service endpoint
 serviceHost.AddServiceEndpoint(
            typeof(ICalculator),
            new WSHttpBinding(SecurityMode.None),  // pass in SecurityMode.None
            "CalculatorService");

Cela annulera tous les paramètres de sécurité, par exemple le ServiceHost ne devrait plus même essayer de trouver le domaine Windows aux appelants de l'authentification à l'.

Est-ce que le changement de vos observations tout?

Essayez également l'arrêt de l'accès à distance automatique service Gestionnaire de connexion. Pour moi, la question est descendu à Dns.GetHostEntry (String.Empty) et ce message http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/493d1b65-9ace-41de-b269-f178d27a8a1b

Il semble que j'ai eu le même problème. Longue durée d'appel ouvert causé par une exception. Je googlé pour la configuration des paramètres de sécurité pour le service WCF. Trouvé la solution suivante qui a fonctionné pour moi:

Sous élément <wsHttpBinding> dans le Web.config Place de fichier l'entrée suivante:

<security mode="None" />

Le Service de référence du client doit être mis à jour!

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