Raiffeisenbank .NET developer á¡ááá¯ááºážá¡ááá¯ááºážááẠViennaNET á á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠá¡áá»ááºážáá»á¯á¶áž áá¯á¶ážáááºáá±áá«áááºá áá®ááᯠáááºááá¯áá±á¬ááºáá¬áá¬áá²á
á€áá±á¬ááºážáá«ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á GitHub repository ááœááºááœá±á·ááŸáááá¯ááºááá·áº ááŒáá·áºáá±áá¬ážáá±á¬ ááœá±áá±ážááœá±áá°áá»á¬ážá áááºážá
á®ááŒááºážáá»á¬ážááŸáá·áº áá±áá¬áá±á·á
áºáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠáá
ááºážá
á¬ážááá±ážáá±á¬ á
á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠááŒááºáááºážááœá¬ážáá«áááºá
ViennaNET.Sagas
ááá±á¬áá»ááºáá
áºáá¯ááẠDDD ááŸáá·áº microservice áááá¯áá¬ááá¯á·ááŒá±á¬ááºážáá±á¬á¡áá«á ááœá²ááŒá¬ážáá±á¬áááºáá±á¬ááºááŸá¯áá»á¬ážáá±á«áºááœáẠáá¯ááºáááºážááá¯ááºáá¬áá¯áá¹ááááᯠááŒáá·áºáá±áá±á¬á¡áá«á ááœá²áá±áá±ážááœá±áá°ááá¹ááá¬ážáá
áºáá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯á¡ááºááŒááºážá áááºáááºáá»á¬ážá
áœá¬ááẠááá¯ááááºážáá»á¬ážá
áœá¬ááᯠáá
áºáá»áááºáááºážááœáẠáááºáá±á¬ááºááŸá¯ááŸááááºáá±á¬ááŒá±á¬áá·áº ááŒá¿áá¬áá
áºáá¯ááŒá
áºáá±á«áºáá¬áá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá
áá»áœááºá¯ááºááá¯á·áááá±á¬áá»ááºáá»á¬ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ážááŸááºážáá±á¬áºáááºáž á¡áá¯á¶ážáááºáá±á¬ ááá¹ááá¬ážáá áºáá¯- áá¬ááºáááºážáá áºáᯠááá¯á·ááá¯áẠáá®ážááŸá¯ááºááŸá¯á¡ááŒá±áá¶ááá·áº áá¬ááºáááºážáá áºáá¯ááŒá áºáááºá áááºážáá¡ááŸá áºáá¬áááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááº- ááá°áá®áá±á¬áááºáá±á¬ááºááŸá¯áá»á¬ážááœáẠáááºááá¯ááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºááá·áº áá¯ááºáááºážá¡ááŒá±á¡áá±áá áºáá¯ááŸáááŒá®ážá áááºááá·áºá¡ááá·áºááœááºáááᯠááŒá¿áá¬áá»á¬ážáá±á«áºáá±á«ááºáá«áá áááºážáááºááŸááá¬áá±áá¬á¡á¬ážáá¯á¶ážá¡ááœáẠrollback áá¯ááºáá¯á¶ážáá¯ááºáááºážááᯠáá±á«áºááẠááá¯á¡ááºáá«áááºá áá±ážáá¬ážáááºá ááá¯á·ááŒá±á¬áá·áºá á¡á±á¬ááºááŒááºááŸá¯áááœá²ááŒá¬ážáá² áá¬ááºáááºážáá¡áá¯á¶ážááœááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááááºážá¡á¬ážáá¯á¶ážááœáẠáá áºááááºáááºážáá±áá¬ááᯠáááºáá¶áááŸááá«áááºá
áá»áœááºá¯ááºááá¯á·á á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááᯠáááºážáá¡ááŒá±áá¶áá¯á¶á á¶ááŒáá·áº ááŒá¯áá¯ááºáá¬ážáá²ááŒá áºááŒá®áž á¡ááŒá¬ážáááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááá·áºáááºážáááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŸáá·áº ááááºááá¯ááºáá«á á¡áá¯á¶ážááŒá¯áááºááááºáá²áá«- T ááẠsaga á¡áá¯ááºáá¯ááºáááºá¡ááœáẠááá¯á¡ááºáá±á¬ áááŠážáá±áá¬á¡ááŒáẠá¡áááºá¡áááºááááºá¡áá»áá¯á·ááᯠááááºážáááºážáá¬ážááá¯ááºááá·áº á¡ááŒá±áᶠá ááá¹ááá¡áááºáž SagaBase<T> á០áááºážáááºáá¬á á±áááºá áá¯ááºáá±á¬ááºáá±á ááºá¡ááœááºáž áááºá ááºá¥ááá¬ááᯠá¡ááá·áºá¡á¬ážáá¯á¶ážááá¯á· ááŒááºááœá¬ážáá«áááºá Saga ááá¯ááºááá¯ááºááẠááá¯ááºáá¶áá²á·áá°áááºážá á¬ážááŒá áºáá±á¬ááŒá±á¬áá·áº ááá¯á¡ááºáá±á¬ááŸá®ááá¯ááŸá¯áá»á¬ážáááŸáááẠDI ááœáẠSingleton á¡ááŒá áºáá¬ážááŸáááá¯ááºáá«áááºá
ááá°áá¬ááŒá±á¬áºááŒá¬-
public class ExampleSaga : SagaBase<ExampleContext>
{
public ExampleSaga()
{
Step("Step 1")
.WithAction(c => ...)
.WithCompensation(c => ...);
AsyncStep("Step 2")
.WithAction(async c => ...);
}
}
ááá°áá¬áá±á«áºááá¯ááŸá¯-
var saga = new ExampleSaga();
var context = new ExampleContext();
await saga.Execute(context);
ááá°áá®áá±á¬ á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážá ááá°áá¬á¡ááŒáá·áºá¡á
á¯á¶ááᯠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
ViennaNET.Orm.*
Nhibernate ááŸáááá·áº á¡áá»áá¯ážáá»áá¯ážáá±á¬ áá±áá¬áá±á·á áºáá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠá á¬ááŒáá·áºááá¯ááºáá»á¬áž á¡á á¯á¶á áá»áœááºá¯ááºááá¯á·ááẠLiquibase ááᯠá¡áá¯á¶ážááŒá¯á DB-First áá»ááºážáááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áááºá ááá¯á·ááŒá±á¬áá·áº á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ áá±áá¬áá±á·á áºááœáẠáá±áá¬ááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáᬠááŸááá«áááºá
ViennaNET.Orm.Seedwork О ViennaNET.Orm
- á¡ááŒá±áᶠá¡ááºáá¬áá±á·á
áºáá»á¬ážááŸáá·áº áááºážááá¯á·á á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬áž á¡áá®ážáá®ážáá«ááŸááá±á¬ á¡ááá á
ááºážáá±ážááœá²áá»á¬ážá áá°ááá¯á·áá²á· á¡ááŒá±á¬ááºážá¡áá¬ááœá±ááᯠá¡áá±ážá
ááẠáá±á·áá¬ááŒáá·áºáá¡á±á¬ááºá
interface ááᯠIEntityFactoryService
ááŸáá·áºáááºážáá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ EntityFactoryService
á¡áá¯ááºáá°áá
áºá áá®ážááŒá¬áž entities áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáááºá¡ááœáẠrepositories áá»á¬ážá¡ááŒáẠcommands á executors ááŸáá·áº direct SQL queries áá»á¬ážááᯠá€áá±áá¬ááœáẠáááºáá®ážáá¬ážáá±á¬ááŒá±á¬áá·áº database ááŸáá·áºá¡áá¯ááºáá¯ááºááŒááºážá¡ááœáẠá¡áááá¡á
á¡áá»ááºááŒá
áºáááºá ááá«ááá¶ááœáẠData áá»á¬ážááá¯áá¬áááºááŸá¯ááá¯ááºá
á±áááºá á¥ááá¬á¡á¬ážááŒáá·áº database áá
áºáá¯ááŸáá·áºá¡áá¯ááºáá¯ááºáááºá¡ááœáẠclass áá
áºáá¯áá
áœááºážáááºáá»á¬ážááá¯ááá·áºáááºáááºá¡áááºááŒá±áááºá áá®ááá¯ááá
á¹á
ááœá±á¡ááœáẠIEntityFactoryService
ááá¯ážáá±áž - interface áá
áºáá¯ááŸááááºá IEntityRepositoryFactory
repositories áááºáá®ážááŒááºážá¡ááœáẠáááºážáááºážáá
áºáá¯áᬠááŒá±ááŒá¬áááºá
áá±áá¬áá±á·á
áºááᯠááá¯ááºááá¯ááºáááºáá±á¬ááºáááºá áááºáá±á¬ááºááŸá¯áá±ážááá·áº ááá¹ááá¬ážááᯠá¡áá¯á¶ážááŒá¯áááºá áá»áœááºá¯ááºááá¯á·áá¡ááœá²á·áá»á¬ážááœááºá¡áá¯á¶ážááŒá¯ááá·áº DBMS áá
áºáá¯á
á®ááœáẠáááºážáááá¯ááºááá¯ááºá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááŸááááºá ViennaNET.Orm.MSSQL, ViennaNET.Orm.Oracle, ViennaNET.Orm.SQLite, ViennaNET.Orm.PostgreSql
.
áá áºáá»áááºáááºážááŸá¬áááºá áááºáá±á¬ááºááŸá¯áá±ážáá°á¡áá»á¬ážá¡ááŒá¬ážááẠá¡ááá®áá±ážááŸááºážáá áºáá¯ááœáẠáá áºáá»áááºáááºážááœáẠá á¬áááºážááœááºážááá¯ááºááŒá®ážá á¥ááá¬á¡á¬ážááŒáá·áºá á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááᯠááŒá¯ááŒááºááœááºážáá¶ááŒááºážá¡ááœáẠáá¯ááºáá»á ááááºáááŸááá²á áááºáá±á¬ááºááŸá¯áá áºáá¯á áá°áá±á¬ááºá¡ááœááºážá០áá áºááá·áºááŒá®ážáá áºááá·áº ááœáŸá±á·ááŒá±á¬ááºážááŒááºážááᯠáá¯ááºáá±á¬ááºááá¯ááºá á±áá«áááºá DBMS áá áºáá¯á០áá±á¬ááºáá áºáá¯á ááá¯á¡ááºáá±á¬áá»áááºáááºááŸá¯ááá¯ááœá±ážáá»ááºááŒááºážá¡ááœááºááá¹ááá¬ážááŸáá·áºá ááá¯á·ááŒá±á¬áá·áºá áá®ážááŒá¬ážentity á¡áááºážá¡ááœááºáá¶á·ááá¯ážáá±ážáá° (áá±áá¬áá±á·á áºááá¬ážáá»á¬ážááá¯á·ááŒá±áá¯á¶ááœá²ááŒááºážá¡ááœááºáá±ážáá¬ážáá¬ážáááº) ááẠBoundedContext á¡áááºážááœááºentity ááá¯á á¬áááºážááœááºážááŒááºáž (ááá¯ááááºážá¡áá¬áá»á¬ážááá¯ááŸááºáá¯á¶áááºáááºáááºážáááºážáá áºáá¯áá«ááŸááááº) ááá¯á·ááá¯ááºáááºážááááºáá¶áá° ApplicationContext (á¡ááá®áá±ážááŸááºážá¡ááœá²á·á¡á ááºážáá»á¬ážá ááá¯ááºááá¯ááºáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááŸáá·áº á¡áááá·áºáá»á¬áž ááŸááºáá¯á¶áááºááŒááºážá¡ááœáẠáááºážáááºážáá»á¬áž áá«áááºáááº)á ááœá²á·á ááºážááŸá¯áá¯á¶á á¶á០áá»áááºáááºááŸá¯á¡ááŸááºá¡áá¬ážááᯠá¡ááŒá±á¬ááºážááŒáá»ááºáá áºáá¯á¡ááŒá Ạáááºáá¶áááº-
"db": [
{
"nick": "mssql_connection",
"dbServerType": "MSSQL",
"ConnectionString": "...",
"useCallContext": true
},
{
"nick": "oracle_connection",
"dbServerType": "Oracle",
"ConnectionString": "..."
}
],
á¥ááᬠApplicationContext-
internal sealed class DbContext : ApplicationContext
{
public DbContext()
{
AddEntity<SomeEntity>("mssql_connection");
AddEntity<MigratedSomeEntity>("oracle_connection");
AddEntity<AnotherEntity>("oracle_connection");
}
}
áá»áááºáááºááŸá¯ ID ááᯠááááºááŸááºáá¬ážáá«á "default" áᯠá¡áááºáá±ážáá¬ážááá·áº áá»áááºáááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
áá±áá¬áá±á·á
áºááá¬ážáá»á¬ážáᶠááá¯ááºááá¯ááºááŒá±áá¯á¶ááœá²ááŒááºážááᯠá
ᶠNHibernate áááááá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á¡áá±á¬ááºá¡áááºáá±á¬áºáááºá áá±á¬áºááŒáá»ááºááᯠxml ááá¯ááºáá»á¬ážááŸáá
áºááá·áºáááºážáá±á¬ááºážá á¡áááºážáá»á¬ážááŸáá
áºááá·áºáááºážáá±á¬ááºáž áááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá Unit tests ááœáẠstub repositories ááᯠá¡áááºááŒá±ááŒá± áá±ážáá¬ážááá¯ááºá
á±áááºá¡ááœáẠLibrary áá
áºáᯠááŸááá«áááºá ViennaNET.TestUtils.Orm
.
ViennaNET.Orm.* á¡áá¯á¶ážááŒá¯ááŒááºážá ááá°áá¬á¡ááŒáá·áºá¡á
á¯á¶ááᯠááœá±á·ááá¯ááºáá«áááºá
ViennaNET.á á¬ááá¯áá±ážááá¯á·ááŒááºážá*
áááºážá á®ááŒááºážáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ á á¬ááŒáá·áºááá¯ááºáá»á¬ážá
áááºážá
á®ááŒááºážáá»á¬ážááŒáá·áºáá¯ááºáá±á¬ááºáááºá áááºážá
á®áááºáá±áá»á¬ááá¯á¡áá¯á¶ážááŒá¯áááºááŒá
áºá
á±á áááºážá
á®áááºáá±áá»á¬ááá¯á¡áá¯á¶ážááŒá¯áááºááŒá
áºá
á± á
á¬ááŒáá·áºááá¯ááºááŸáá·áºáá¯ááºáá±á¬ááºáá¬ááœáẠá¡áá»á¬ážáá¯á¶ážááŒá
áºááá¯ááºáá»á±ááŸááá±á¬ áá±á«ááºážá
ááºáá»ááºážáááºáááºážááᯠDBMS á¡áá»áá¯ážáá»áá¯ážááŒáá·áº áá°áá®áá±á¬áá»ááºážáááºáááºážááᯠááœá±ážáá»ááºáá²á·áááºá á
á¬ááŒáá·áºááá¯áẠViennaNET.Messaging
á€á
ááºážáá¯á¶ážáá®ááœááºááŸá¯á¡ááœáẠá¡ááá¡áá» áá¬áááºááŸááá«áááºá ViennaNET.Messaging.MQSeriesQueue, ViennaNET.Messaging.RabbitMQQueue О ViennaNET.Messaging.KafkaQueue
IBM MQá RabbitMQ ááŸáá·áº Kafka á¡ááœáẠadapter á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬áž á¡áá®ážáá®áž áá«áááºáá«áááºá
áááºážá á®ááŒááºážáá»á¬ážááŒáá·áº áá¯ááºáá±á¬ááºááá·áºá¡áá«á áááºáá±á·áá»áºáááºáá¶ááŒááºážááŸáá·áº áá±ážááá¯á·ááŒááºáž áá¯ááºáááºážá áẠááŸá áºáá¯ááŸááááºá
áááºáá¶á
ááºážá
á¬ážáá«á á€áá±áá¬ááœáẠááœá±ážáá»ááºá
áᬠ2 áᯠááŸááááº- á
ááºáááºáááŒáẠáá¬ážáá±á¬ááºááŒááºážá¡ááœáẠááŸáá·áº áááºáá±á·áá»áºáá
áºáá¯áááºáž áááºáá¶ááŒááºážá¡ááœááºá áááºážá
á®ááŒááºážááᯠá¡áááºáááŒááºáá¬ážáá±á¬ááºáááºá á¡ááœá±áááºáá¶ááá·áº áááá¯áááºáá¬á¡áááºážááᯠáŠážá
áœá¬áá±á¬áºááŒááá«áááºá IMessageProcessor
áááºáá¬áá±á¬ áááºáá±á·áá»áºááᯠá
á®áá¶áá±á¬ááºááœááºáá±ážááẠáá¬áááºááŸááááºá ááá¯á·áá±á¬ááºá áááºážá¡á¬áž áááºááŸááºáá¬ážáá±á¬ áááºážá
á®áá
áºáá¯ááá¯á· "ááá·áºááºáá»áááº" ááááºá áááºážááᯠááŸááºáá¯á¶áááºááŒááºážááŒáá·áº áá¯ááºáá±á¬ááºáááºá IQueueReactorFactory
á
á®á
ááºáááºááŸááºááŸá¯á០áááºážá
á®á¡ááŸááºá¡áá¬ážááᯠááœáŸááºááŒáááº-
"messaging": {
"ApplicationName": "MyApplication"
},
"rabbitmq": {
"queues": [
{
"id": "myQueue",
"queuename": "lalala",
...
}
]
},
á áááºáá¬ážáá±á¬ááºááŒááºáž á¥ááá¬-
_queueReactorFactory.Register<MyMessageProcessor>("myQueue");
var queueReactor = queueReactorFactory.CreateQueueReactor("myQueue");
queueReactor.StartProcessing();
ááá¯á·áá±á¬ááºá áááºáá±á¬ááºááŸá¯á áááºáááºááŸáá·áº á áááºáá¬ážáá±á¬ááºááẠáááºážáááºážááᯠáá±á«áºáá±á¬á¡áá«á áááºááŸááºáá¬ážáá±á¬ áááºážá á®á០áááºáá±á·áá»áºáá»á¬ážá¡á¬ážáá¯á¶áž áááºááá¯ááºáᬠáááá¯áááºáá¬áá¶ááá¯á· áá±á¬ááºááœá¬ážáá«áááºá
á
ááºáá¯á¶áá¯á¶ážá¡ááºáá¬áá±á·á
áºááœáẠáááºáá±á·áá»áºáá
áºáá¯áááºážááᯠáááºáá¶ááá°ááẠIMessagingComponentFactory
áááºážáááºážáá
áºáá¯ááŸááá«áááºá CreateMessageReceiver
áááºážáá¶ááá¯á· áááºááŸááºáá¬ážáá±á¬ áááºážá
á®á០áááºáá±á·áá»áºááᯠá
á±á¬áá·áºááá¯ááºážáá±ááá·áº áááºáá¶áá°á¡á¬áž áááºáá®ážáá±ážáááº-
using (var receiver = _messagingComponentFactory.CreateMessageReceiver<TestMessage>("myQueue"))
{
var message = receiver.Receive();
}
áááºáá±á·ááá¯á·ááẠá¡áá°áá°áá¯á¶ážááá¯á·ááá¯áááºá IMessagingComponentFactory
áááºáá±á·áá»áºááá¯á·áá° áááºáá®ážáá«á
using (var sender = _messagingComponentFactory.CreateMessageSender<MyMessage>("myQueue"))
{
sender.SendMessage(new MyMessage { Value = ...});
}
áááºáá±á·áá»áºááᯠá
á®á
á¥áºááŒá®áž ááœá²ááŒá¬ážáááºááŸááºááŒááºážá¡ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážááá·áº ááœá±ážáá»ááºá
áá¬áá¯á¶ážáá¯ááŸááááº- á
á¬áá¬ážá XML ááŸáá·áº JSON áá»áŸáá¬ááŒá
áºáá±á¬áºáááºáž ááá¯á¡ááºáá«áá áááºááẠáááºáááá¯ááºááá¯ááºá¡ááºáá¬áá±á·á
áºá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯áá»á¬ážááᯠá¡ááœááºááá°ááŒá¯áá¯ááºááá¯ááºáááºá IMessageSerializer О IMessageDeserializer
.
áááºážá
á®áááºáá±áá»á¬áá
áºáá¯á
á®á áá°ážááŒá¬ážáá±á¬á
áœááºážáááºáá»á¬ážááᯠááááºážááááºážáá¬ážááẠáá»áœááºá¯ááºááá¯á·ááŒáá¯ážá
á¬ážáá²á·ááŒá®ážá á¥ááá¬á ViennaNET.Messaging.MQSeriesQueue
á
á¬áá¬ážáá¬áá byte áááºáá±á·ááºá»áá»á¬ážááá¯áá« áá±ážááá¯á·ááá¯ááºá
á±áá«áááºá ViennaNET.Messaging.RabbitMQQueue
áááºážááŒá±á¬ááºážáááºážááŒá±á¬ááºážááŸáá·áº áá»á¶áááºážááŸá¯ áááºážá
á®ááŒááºážááᯠáá¶á·ááá¯ážáá±ážáááºá RabbitMQ á¡ááœáẠáá»áœááºá¯ááºááá¯á·á adapter wrapper ááẠRPC á áá¯á¶ááá¹áá¬ááºá¡áá»áá¯á·ááá¯áááºáž áá¯ááºáá±á¬ááºáááº- áá»áœááºá¯ááºááá¯á·ááẠáááºáá±á·áá»áºááá¯á·ááŒá®áž áá¯á¶á·ááŒááºááŸá¯áááºáá±á·áá»áºáá
áºáá¯á¡ááœááºáᬠáááºáá®ážáá¬ážááá·áº á¡áá°áž áá¬áá®áááºážá
á®á០áá¯á¶á·ááŒááºááŸá¯ááᯠá
á±á¬áá·áºáá»áŸá±á¬áºáá±áá«áááºá
ViennaNET.CallContext
áá»áœááºá¯ááºááá¯á·ááẠááá°áá®áá±á¬á
áá
áºáá»á¬ážááŒá¬áž áá±á«ááºážá
ááºážáááºá¡ááœááºáá¬áá áá°áá®áá±á¬á¡ááá®áá±ážááŸááºážáá
áºáá¯á microservices áá»á¬ážá¡ááŒá¬áž áááºááœááºááŸá¯á¡ááœááºáááºáž áááºážá
á®ááŒááºážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá áááºážááẠá¡áá¯á¶ážááŒá¯áá°ááááºáá±á¬ááºááŸá¯áá²á·ááá¯á·áá±á¬ á¡áááºáá±áá¬á á¡áá¯á¶ážááŸá¡áá¯á¶ážááŸááºáááºážááá°ááŒááºážá¡ááœáẠáá±á¬ááºážááá¯áá»ááºá¡áá±á¬ááºá¡áá¬ážá áááºážááŒá
ẠIP ááááºá
á¬ááŸáá·áº ááœáá·áºááŒá¯áá»ááºáá±áá¬ááá¯á·ááᯠáááºáá±á·áá»áºááŸáá·áºá¡áá° áá±ážááá¯á·ááẠááá¯á¡ááºáá¬áááºá á€áá±áá¬ááᯠáááºááá·áºáá±ážááá¯á·ááŒááºážá¡á¬áž á¡áá±á¬ááºá¡áááºáá±á¬áºáááºá áá»áœááºá¯ááºááá¯á·ááẠá
á¬ááŒáá·áºááá¯ááºáá
áºáá¯ááᯠáá®ááœááºáá²á·áááºá ViennaNET.CallContext
áááºáá±á¬ááºááŸá¯áá²ááá¯á· áááºáá±á¬ááºááá·áº áá±á¬ááºážááá¯áá»ááºá០áá±áá¬ááᯠááááºážáááºážááá¯ááºá
á±ááá·áºá á€ááá
á¹á
ááœááºá áááºážá
á®ááŒááºáž ááá¯á·ááá¯áẠHttp ááŸáá
áºááá·áº áá±á¬ááºážááá¯ááŸá¯ááᯠáááºááá¯á·ááŒá¯áá¯ááºáá²á·áááºááŸá¬ á¡áá±ážáááŒá®ážáá«á ááá¯á·áá±á¬áẠá¡ááœááºáá±á¬ááºážááá¯ááŸá¯ ááá¯á·ááá¯áẠáááºáá±á·áá»áºááᯠáááá¯á·áá®á á¡ááŒá±á¬ááºážá¡áá¬á០á¡áá»ááºá¡áááºáá»á¬ážááᯠáá¯ááºáá°ááŒá®áž áá±á«ááºážá
á®ážáá»á¬ážááœáẠááá·áºááœááºážáá«á ááá¯á·ááŒá±á¬áá·áº áá±á¬ááºáááºáá±á¬ááºááŸá¯ááẠá¡áááºáá±áá¬ááᯠáááºáá¶áááŸáááŒá®áž ááá¯áááºážá¡ááá¯ááºáž á
á®áá¶ááá·áºááœá²áááºá
ááá·áºá¡á¬áá¯á¶á
áá¯ááºááŸá¯á¡ááœáẠáá»á±ážáá°ážáááºáá«áááºá ááá·áºááŸááºáá»ááºáá»á¬ážááŸáá·áº áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠááœá²áá¯ááºááẠáá»áœááºá¯ááºááá¯á· áá»áŸá±á¬áºááá·áºáá«áááºá
source: www.habr.com