Я хотел начать с использования Remoting под C # в тестовом режиме, но я застрял.
Одна вещь, которую я нашел по этой теме, - это статья Марка Клифтона , но он, кажется, запускает сервер, запуская его вручную с консоли.
Я пытаюсь запустить сервер (т.е. зарегистрировать класс обслуживания) в тестовом приборе.
Я, вероятно, также неправильно использую интерфейс, но это будет позже.
Я всегда получаю исключение (извините за немецкое сообщение), что канал уже зарегистрирован.
System.Runtime.Remoting.RemotingException: Der Channel tcp wurde bereits registriert.
После комментирования строки ChannelServices.RegisterChannell () в тестовом методе это происходит для вызова Activator.GetObject ().
Я пытался поместить StartServer () в поток, но это тоже не помогло.
Я обнаружил, что создание нового AppDomain может быть возможным способом, но еще не пробовал.
Можете ли вы сказать мне, если мой подход по своей сути неверен? Как я могу это исправить?
using System;
using NUnit.Framework;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Tcp;
namespace Bla.Tests.Remote
{
[TestFixture]
public class VerySimpleProxyTest
{
int port = 8082;
string proxyUri = "MyRemoteProxy";
string host = "localhost";
IChannel channel;
[SetUp]
public void SetUp()
{
StartServer();
}
[TearDown]
public void TearDown()
{
StopServer();
}
[Test]
public void UseRemoteService()
{
//IChannel clientChannel = new TcpClientChannel();
//ChannelServices.RegisterChannel(clientChannel, false);
string uri = String.Format("tcp://{0}:{1}/{2}", host, port, proxyUri);
IMyTestService remoteService = (IMyTestService)Activator.GetObject(typeof(IMyTestService), uri);
Assert.IsTrue(remoteService.Ping());
//ChannelServices.UnregisterChannel(clientChannel);
}
private void StartServer()
{
channel = new TcpServerChannel(port);
ChannelServices.RegisterChannel(channel, false);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyTestService), proxyUri, WellKnownObjectMode.Singleton);
}
private void StopServer()
{
ChannelServices.UnregisterChannel(channel);
}
}
public interface IMyTestService
{
bool Ping();
}
public class MyTestService : MarshalByRefObject, IMyTestService
{
public bool Ping()
{
return true;
}
}
}