Pregunta

Esta es una pregunta similar a esta: Win32Exception @ ServiceHost.Open () para el servicio de WCF .

Tengo una máquina que es muy lento en la llamada ServiceHost.Open a continuación. Se necesita constantemente 7 segundos o menos para abrir el servicio, cada vez. Esta máquina es mi cuadro de casa, y es no parte de un dominio.

Puedo ejecutar el mismo código en otra caja (mi caja de trabajo) que es parte de un dominio y el host de servicio se abre en unos 3-4 segundos en la primera llamada, pero si funciono el programa de nuevo el host de servicio se abre en aproximadamente 1 segundo o menos.

He trabajado con la ayuda del ms en esto, y que genera registros de seguimiento y la parte que está colgado en es donde se sale y trata de conectarse a un dominio, incluso en la máquina que no es parte de un dominio. Y lo que es el "el dominio especificado no existe o no se pudo establecer contacto." excepción en el registro de seguimiento, y ahí es donde todo el tiempo se está comido.

Pero lo que es realmente extraño es que incluso en mi máquina de trabajo, si no estoy conectado a un dominio (como si no estoy en mi red de trabajo y sólo corriendo de casa) Todavía No obtener la demora.

Me reconstruida usando mi máquina de Windows 7 de 64 bits, y se produce el mismo comportamiento (se estaba ejecutando XP SP3, que he restaurado cuando no parecía Windows 7 para solucionar el problema).

Me preguntaba si alguien tenía alguna idea de lo que podría causar esto. Por cierto, si desactivar "Cliente para redes Microsoft", el tiempo es como 4 segundos para abrir la ServiceHost, pero que todavía no es tan rápido como esta máquina solía ser capaz de abrir el servicio. De alguna manera, se piensa que se supone que es parte de un dominio o algo así.

    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;
    }

Aquí está mi app.config, pero no tengo ningún ajuste de configuración de seguridad especiales para el servicio allí, sólo algunos ajustes de diagnóstico que permitan el seguimiento de 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>

Tenga en cuenta también que mi definición de servicio tiene SessionMode necesario (ver más abajo). Si tomo el requisito SessionMode a cabo, no consigo los retrasos.

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);

    }
}
¿Fue útil?

Solución 2

Resulta que si NetBIOS sobre mis desactivar las conexiones de red, que no reciben los retrasos en las llamadas ServiceHost.Open. No estoy seguro de por qué, pero esto parecía para solucionar el problema.

Lo raro es que cuando hice una instalación limpia de XP, no tenía los retrasos, incluso con el NetBIOS activado, así que no tengo idea de por qué sucede con mi instalación existente (que se ha instalado la limpieza en esta misma máquina y, a continuación, restaurar mi copia de seguridad de una imagen para ejecutar estas pruebas).

Otros consejos

Está bien, mi sospecha es el hecho de que estés utilizando una unión (WsHttpBinding) que por defecto es la autenticación de sus llamadas utilizando las credenciales de Windows a menos que se diga específicamente que no lo hiciera.

En el código de servicio de alojamiento, sólo estás instanciar una instancia WsHttpBinding por defecto - no hay ningún ajuste en la configuración o código para cambiar el comportamiento de seguridad predeterminado, en ese caso

.

Sólo para propósitos de prueba: tratar de cambiar su código de servicio de alojamiento a:

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

Esto efectivamente cancelará todos los ajustes de seguridad, por ejemplo, la ServiceHost ya ni siquiera debe intentar encontrar el dominio de Windows para la autenticación en las personas que llaman.

¿Cambia cualquiera de sus observaciones?

También intente detener el servicio de acceso remoto automático de Connection Manager. Para mí, la cuestión se reducía a Dns.GetHostEntry (String.Empty) y este post http://social.msdn.microsoft.com/Forums/en/vbgeneral/thread/493d1b65-9ace-41de-b269-f178d27a8a1b

Parece que tenía el mismo problema. Larga duración de la llamada abierta causada por una excepción. Busqué en Google para la configuración de opciones de seguridad de servicio WCF. Encontrado la siguiente solución que funcionó para mí:

Bajo elemento <wsHttpBinding> en el Web.config lugar archivo de la siguiente entrada:

<security mode="None" />

La referencia de servicio en el cliente debe actualizarse!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top