Remoting: Поиск клиентского AppDomain / Assembly с сервера AppDomain - PullRequest
3 голосов
/ 21 января 2010

У меня есть приложение с сервером «Домен приложений», которое принимает вызовы от отдельных доменов приложений (в которых размещаются плагины, разработанные другими людьми и не заслуживающие доверия).

С сервера AppDomain мне нужно знать, какой «Плагин» (AppDomain) фактически выполняет вызов, чтобы я мог убедиться, что у этого плагина есть доступ к ресурсу.

Я мог бы просто передать учетные данные для вызова метода удаленного взаимодействия, но я обеспокоен тем, что при этом хитрый программист из «Плагина А» может изменить код так, чтобы он, казалось, исходил из «Плагина В».

Я изучил создание своей собственной реализации "ObjRef" в приложении "Сервер", полагая, что "ChannelInfo.ChannelData" может содержать информацию о клиентском плагине, выполняющем вызов, и реализовал следующий код:

public int DomainId
    {
        get
        {
            int domainId = -1;

            // The type "System.Runtime.Remoting.Channels.CrossAppDomainData" is not Public,
            // so we have to use reflection to get access to it.
            for (int i = 0; i < ChannelInfo.ChannelData.Length; i++)
            {
                object o = ChannelInfo.ChannelData[i];
                if (o.ToString() == "System.Runtime.Remoting.Channels.CrossAppDomainData")
                {
                    System.Reflection.BindingFlags flags =
                        System.Reflection.BindingFlags.GetProperty
                        | System.Reflection.BindingFlags.Instance
                        | System.Reflection.BindingFlags.NonPublic;

                    domainId = (int)o.GetType().GetProperty("DomainID", flags).GetValue(o, null);
                }
            }
            return domainId;
        }
    }

Но полученный с помощью DomainId такой же, как и у сервера AppDomain.CurrentDomain.Id, когда мне действительно нужен идентификатор клиентского (вызывающего) AppDomain

Такое ощущение, что это слишком сложно: -)

Есть идеи?

1 Ответ

0 голосов
/ 07 мая 2012

Можете ли вы попросить их поместить какой-то билет в контекст вызова? Если вы можете, было бы легко идентифицировать вызывающего абонента и действовать в результате. Может быть, это не лучшее решение, но должно работать. Мы сделали это один, и я думаю, что это все еще в прод;)

...