«Ошибка аутентификации» при вызове метода для удаленного объекта в wpf - PullRequest
0 голосов
/ 17 марта 2010

Я разрабатываю приложение, которое использует WindowsFormsApplicationBase для принудительного применения единого экземпляра. Я получаю следующую ошибку при вызове метода на удаленном объекте. Это работает нормально, если я не использую подход единственного экземпляра.

System.Runtime.Remoting.RemotingException: Ошибка аутентификации ---> System.IO.IOException: Невозможно прочитать данные из транспортного соединения: Соединение было закрыто. в System.Net.Security.NegoState.ProcessAuthentication (LazyAsyncResult lazyResult) в System.Net.Security.NegotiateStream.AuthenticateAsClient (учетные данные NetworkCredential, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowImpersonationLevel) at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.CreateAuthenticatedStream (Поток netStream, String machinePortAndSid)

Вот мой код:

public class EntryPoint
{
    [STAThread]
    public static void Main(string[] args)
    {
        SingleInstanceManager sim = new SingleInstanceManager();
        sim.Run(args);
    }
}


public class SingleInstanceManager : WindowsFormsApplicationBase
{
    private App app;

    public SingleInstanceManager()
    {
        IsSingleInstance = true;
    }

    protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs eventArgs)
    {
        app = new App();
        app.InitializeComponent();
        app.Run();
        return false;
    }

    protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
    {
        base.OnStartupNextInstance(eventArgs);
        app.Activate();
    }
}

Вот так я вызываю объект Remoting:

public Hashtable GetData(string[] arg1, string[] arg2)
{
    IDataProvider dataProvider = (IDataProvider )Activator.GetObject(typeof(IDataProvider ), "tcp://.....");

    Hashtable data = dataProvider.GetData(arg1, arg2);

    return data;
}

Заранее спасибо.

1 Ответ

0 голосов
/ 17 марта 2010

Я нашел решение сам.

Я использовал следующее для реализации одного экземпляра (http://www.ai.uga.edu/mc/SingleInstance.html).

[STAThread]
static void Main()                  // args are OK here, of course
{
    bool ok;
    m = new System.Threading.Mutex(true, "YourNameHere", out ok);

    if (! ok)
    {
        MessageBox.Show("Another instance is already running.");
        return;
    }

    Application.Run(new Form1());   // or whatever was there

    GC.KeepAlive(m);                // important!
}
...