원격 서비스 예제: 수명
이 항목은 이전 버전의 기존 응용 프로그램과의 호환성을 위해 유지되고 있으나 새로운 개발에는 권장되지 않는 레거시 기술에 대해 설명합니다. 분산 응용 프로그램은 이제 WCF(Windows Communication Foundation)를 사용하여 개발됩니다.
다음 코드 예제에서는 몇 가지 수명 임대 시나리오를 보여 줍니다. Client.exe
는 초기 임대 시간 후 ClientActivatedType.InitializeLifetimeService()
에 지정된 임대와 다른 TimeSpan의 임대를 갱신하는 스폰서를 등록합니다. MyClientSponsor
는 Server.exe
응용 프로그램 도메인의 임대 관리자를 참조하여 전달될 수 있도록 MarshalByRefObject를 확장합니다. 이 응용 프로그램은 단일 컴퓨터에서 실행되거나 네트워크에서 실행됩니다. 네트워크를 통해 이 응용 프로그램을 실행하려면 클라이언트 구성의 **"localhost"**를 원격 컴퓨터의 이름으로 바꿉니다.
주의: |
---|
.NET Remoting은 기본적으로 인증이나 암호화를 수행하지 않습니다. 따라서 원격으로 클라이언트 또는 서버와 상호 작용하기 전에 해당 클라이언트 또는 서버의 ID를 확인하는 데 필요한 모든 단계를 수행하는 것이 좋습니다. .NET Remoting 응용 프로그램이 실행되려면 FullTrust 권한이 필요하기 때문에 인증되지 않은 클라이언트가 서버에 액세스할 수 있도록 허용된 경우에는 클라이언트가 완전히 신뢰된 것처럼 코드를 실행할 수 있습니다. 따라서 원격 형식을 IIS(인터넷 정보 서비스)에 호스팅하거나 이 작업을 수행할 사용자 지정 채널 싱크 쌍을 작성하여 항상 끝점을 인증하고 통신 스트림을 암호화하십시오. |
Server.exe를 실행한 다음 Client.exe를 실행하면 다음과 같은 출력이 표시됩니다.
Server.exe:
C:\projects\Lifetime\Server\bin>server
The server is listening. Press Enter to exit....
ClientActivatedType.RemoteMethod called.
Client.exe:
C:\projects\Lifetime\Client\bin>client
Client-activated object: RemoteMethod called. MyDomain\SomeUser
Press Enter to end the client application domain.
I've been asked to renew the lease.
Time since last renewal:00:00:09.9432506
I've been asked to renew the lease.
Time since last renewal:00:00:29.9237760
이 샘플을 컴파일하려면
명령 프롬프트에 다음 명령을 입력합니다.
csc /t:library RemoteType.cs csc /r:System.Runtime.Remoting.dll /r:RemoteType.dll server.cs csc /r:System.Runtime.Remoting.dll /r:RemoteType.dll client.cs
vbc /t:library RemoteType.vb vbc /r:System.Runtime.Remoting.dll /r:RemoteType.dll server.vb vbc /r:System.Runtime.Remoting.dll /r:RemoteType.dll client.vb
RemoteType
using System;
using System.Runtime.Remoting.Lifetime;
using System.Security.Principal;
namespace RemoteType
{
public class ClientActivatedType : MarshalByRefObject
{
public override Object InitializeLifetimeService()
{
ILease lease = (ILease)base.InitializeLifetimeService();
// Normally, the initial lease time would be much longer.
// It is shortened here for demonstration purposes.
if (lease.CurrentState == LeaseState.Initial)
{
lease.InitialLeaseTime = TimeSpan.FromSeconds(3);
lease.SponsorshipTimeout = TimeSpan.FromSeconds(10);
lease.RenewOnCallTime = TimeSpan.FromSeconds(2);
}
return lease;
}
public string RemoteMethod()
{
// Announces to the server that the method has been called.
Console.WriteLine("ClientActivatedType.RemoteMethod called.");
// Reports the client identity name.
return "RemoteMethod called. " + WindowsIdentity.GetCurrent().Name;
}
}
}
Imports System
Imports System.Runtime.Remoting.Lifetime
Imports System.Security.Principal
Namespace RemoteType
Public Class ClientActivatedType
Inherits MarshalByRefObject
Public Overrides Function InitializeLifetimeService() As Object
Dim lease As ILease = MyBase.InitializeLifetimeService()
' Normally, the initial lease time would be much longer.
' It is shortened here for demonstration purposes.
If (lease.CurrentState = LeaseState.Initial) Then
lease.InitialLeaseTime = TimeSpan.FromSeconds(3)
lease.SponsorshipTimeout = TimeSpan.FromSeconds(10)
lease.RenewOnCallTime = TimeSpan.FromSeconds(2)
End If
Return lease
End Function
Public Function RemoteMethod() As String
Console.WriteLine("ClientActivatedType.RemoteMethod called.")
' Reports the client identity name.
Return "RemoteMethod called. " & WindowsIdentity.GetCurrent().Name
End Function
End Class
End Namespace
Server
using System;
using System.Runtime.Remoting;
namespace Server
{
class Program
{
static void Main(string[] args)
{
RemotingConfiguration.Configure("Server.exe.config", false);
Console.WriteLine("The server is listening. Press Enter to exit....");
Console.ReadLine();
}
}
}
Imports System
Imports System.Runtime.Remoting
Class Program
Shared Sub Main()
RemotingConfiguration.Configure("Server.exe.config", False)
Console.WriteLine("The server is listening. Press Enter to exit....")
Console.ReadLine()
End Sub
End Class
Server.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="1234">
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
</channel>
</channels>
<service>
<activated type="RemoteType.ClientActivatedType, RemoteType" />
</service>
</application>
</system.runtime.remoting>
</configuration>
Client
using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Lifetime;
using RemoteType;
class Client
{
static void Main(string[] args)
{
RemotingConfiguration.Configure("Client.exe.config",false);
ClientActivatedType obj = new ClientActivatedType();
ILease lease = (ILease)obj.GetLifetimeService();
MyClientSponsor sponsor = new MyClientSponsor();
lease.Register(sponsor);
Console.WriteLine("Client-activated object: " + obj.RemoteMethod());
Console.WriteLine("Press Enter to end the client application domain.");
Console.ReadLine();
}
}
public class MyClientSponsor : MarshalByRefObject, ISponsor
{
private DateTime lastRenewal;
public MyClientSponsor()
{
Console.WriteLine("MyClientSponsor.ctor called");
lastRenewal = DateTime.Now;
}
public TimeSpan Renewal(ILease lease)
{
Console.WriteLine("I've been asked to renew the lease.");
Console.WriteLine("Time since last renewal:" + (DateTime.Now - lastRenewal).ToString());
lastRenewal = DateTime.Now;
return TimeSpan.FromSeconds(20);
}
}
Imports System
Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Lifetime
Imports RemoteType
Class Client
Shared Sub Main()
RemotingConfiguration.Configure("Client.exe.config", False)
Dim obj As ClientActivatedType = New ClientActivatedType()
Dim lease As ILease = CType(obj.GetLifetimeService(), ILease)
Dim sponsor As MyClientSponsor = New MyClientSponsor()
lease.Register(sponsor)
Console.WriteLine("Client-activated object: " + obj.RemoteMethod())
Console.WriteLine("Press Enter to end the client application domain.")
Console.ReadLine()
End Sub
End Class
Public Class MyClientSponsor
Inherits MarshalByRefObject
Implements ISponsor
Dim lastRenewal As DateTime
Public Sub New()
lastRenewal = DateTime.Now
End Sub
Public Function Renewal(ByVal lease As System.Runtime.Remoting.Lifetime.ILease) As System.TimeSpan Implements System.Runtime.Remoting.Lifetime.ISponsor.Renewal
Console.WriteLine("I've been asked to renew the lease.")
Console.WriteLine("Time since last renewal:" + (DateTime.Now - lastRenewal).ToString())
lastRenewal = DateTime.Now
Return TimeSpan.FromSeconds(20)
End Function
End Class
Client.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.remoting>
<application>
<channels>
<channel ref="tcp" port="0">
<clientProviders>
<formatter ref="binary"/>
</clientProviders>
<serverProviders>
<formatter ref="binary" typeFilterLevel="Full"/>
</serverProviders>
</channel>
</channels>
<client url="tcp://localhost:1234">
<activated type="RemoteType.ClientActivatedType, RemoteType" />
</client>
</application>
</system.runtime.remoting>
</configuration>