Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2014, 10:53   #1
aquaMakc
Новичок
Джуниор
 
Регистрация: 13.11.2014
Сообщений: 2
По умолчанию WCF сервер. экземпляр класса превращается в null.

Доброго времени суток.
Разбираюсь с WCF.
Есть WCF сервис, который крутиться, как служба windows. Есть WinForm клиент. При создании сервиса также создаются классы работы с БД и XML.
При обращении клиента к экземплярам этих классов оказывается, что они Null.
Методы, без обращения к классам выполняются без проблем.
Код сервиса:
Код:
namespace VikingServer
{
    [ServiceContract] // Говорим WCF что это интерфейс для запросов сервису
    public interface ServerInterface
    {
        [OperationContract] // Делегируемый метод.
        string GetCommandString(int i);

        [OperationContract] // Делегируемый метод.
        string GetAplusB(int a, int b);

        //[OperationContract]
        //bool startWcfServer(TXmlConfig cfg, TDataBase db, TProtocol prot);

        [OperationContract]
        String getXml();
    }

    [ServiceBehavior(
    ConcurrencyMode = ConcurrencyMode.Single,
    InstanceContextMode = InstanceContextMode.PerSession,
    IncludeExceptionDetailInFaults = true
    )]

    public class TWcfServer : ServerInterface
    {
        TXmlConfig XmlConfig;
        TDataBase DataBase;
        TProtocol protocol;
        String st = "bbb";

        public delegate void logDelegate(String str);
        public event logDelegate logEvent;

        ServiceHost host;
        NetTcpBinding NetTcp = new NetTcpBinding();

        public bool startWcfServer(TXmlConfig cfg, TDataBase db, TProtocol prot)
        {
            try
            {
                XmlConfig = cfg;
                DataBase = db;
                protocol = prot;
                NetTcp.TransferMode = TransferMode.Streamed;
                host = new ServiceHost(typeof(TWcfServer));
                int port = 5555;
                if (!XmlConfig.getTcpPort(out port))
                {
                    logEvent("Empty config");
                    return false;
                }
                host.AddServiceEndpoint(typeof(ServerInterface), new NetTcpBinding(), "net.tcp://localhost:" + port.ToString());
                host.Open();
                logEvent("Communication server start. TCP Port: " + port.ToString());
                return true;
            }
            catch (Exception ex)
            {
                logEvent("Error of starting communication server\r\n" + ex.ToString());
                return false;
            }
        }

        public string GetCommandString(int i)
        {
            switch (i)
            {
                case 1:// TODO: Реализация старта выполнения ваших команд
                    return "Start command";

                case 0:// TODO: Реализация остановки выполнения ваших команд
                    return "Stop command";

                default:// TODO: Выполнение какой-либо вашей команды
                    return "Command " + i.ToString();
            }
        }

        public string GetAplusB(int a, int b)
        {
            int s = a + b;
            return s.ToString();
        }

        public String getXml()
        {
            int port = 0;
            XmlConfig.getTcpPort(out port);
            return port.ToString();
        }
    }
}
Код клиента:
Код:
namespace WcfClient
{
    [ServiceContract]
    public interface ServerInterface
    {
        [OperationContract]
        string GetCommandString(int i);

        [OperationContract]
        string GetAplusB(int a, int b);

        [OperationContract]
        String getXml();
    }

    public partial class Form1 : Form
    {
        EndpointAddress EPA;
        NetTcpBinding NetTcp;
        ServerInterface service;
        public Form1()
        {
            InitializeComponent();
            EPA = new EndpointAddress("net.tcp://localhost:5555");
            NetTcp = new NetTcpBinding();
            ChannelFactory<ServerInterface> factory = new ChannelFactory<ServerInterface>(NetTcp, EPA);
            service = factory.CreateChannel(); 
        }

        private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = service.GetAplusB(int.Parse(t_a.Text), int.Parse(t_b.Text));
        }

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = service.GetCommandString(1);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            try
            {
                textBox1.Text = service.getXml();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }
}
aquaMakc вне форума Ответить с цитированием
Старый 13.11.2014, 12:31   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

1) startWcfServer() у вас вообще никогда не вызывается => ничего не создается
2) В любом случае у вас на каждую сессию будет создаваться новый TWcfServer (с Delphi перешли, да? ) с необходимостью новой инициализации (startWcfServer).
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 13.11.2014, 13:03   #3
aquaMakc
Новичок
Джуниор
 
Регистрация: 13.11.2014
Сообщений: 2
По умолчанию

startWcfServer() у меня вызывается при запуске в основном классе, там-же происходит создание переданных классов.
TWcfServer также создаётся в основном классе.
Код:
 public class VikingServer : ServiceBase
    {
        string folderPath = @"E:\temp\log.log";
        public enum language { Rus, Eng };

        // The main entry point for the process
        static void Main()
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] { new VikingServer() };
            ServiceBase.Run(ServicesToRun);
        }
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        /// 

        ~VikingServer()
        {
            
        }

        private void InitializeComponent()
        {
            this.ServiceName = "VikingServer";
              
        }

        /// <summary>
        /// Set things in motion so your service can do its work.
        /// </summary>
        protected override void OnStart(string[] args)
        {
            outLog("Viking server start");
            start();
        }
        /// <summary>
        /// Stop this service.
        /// </summary>
        protected override void OnStop()
        {
            NetServer.thrStop();
            outLog("Viking server stop");
        }

        TWcfServer WcfServer;
        TNetServer NetServer;
        TXmlConfig XmlConfig;
        TDataBase DataBase;
        static TProtocol protocol;
        List<Tclient> clients;
        
        void start()
        {
            XmlConfig = new TXmlConfig();
            XmlConfig.logEvent += new TXmlConfig.logDelegate(outLog);            
            protocol = new TProtocol();
            clients = new List<Tclient>();
            try
            {
                if (!XmlConfig.openConfig())
                {
                    this.Stop();
                    return;
                }
                if (!startDB())
                {
                    this.Stop();
                    return;
                }
                if (!startWcf())
                {
                    this.Stop();
                    return;
                }
                if (!startNet())
                {
                    this.Stop();
                    return;
                }
            }
            catch (Exception ex)
            {
                outLog(ex.ToString());
            }
        }

        bool startWcf()
        {
            WcfServer = new TWcfServer();
            WcfServer.logEvent += new TWcfServer.logDelegate(outLog);
            if (!WcfServer.startWcfServer(XmlConfig, DataBase, protocol))
                return false;         
            return true;
        }

        bool startNet()
        {
            NetServer = new TNetServer(XmlConfig, DataBase, protocol);
            NetServer.logEvent += new TNetServer.logDelegate(outLog);
            int port = 5555;
            if (!XmlConfig.getTcpPort(out port))
                return false;
            return NetServer.startNetServer(port);
        }

        bool startDB()
        {
            DataBase = new TDataBase();
            DataBase.logEvent += new TDataBase.logDelegate(outLog);
            if (!DataBase.connectDB())
                return false;           
            return true;
        }

        void eventInit()
        {
            
        }

        void outLog(String str)
        {
            String logWrite = DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString();
            logWrite += "> " + str + "\r\n";
            File.AppendAllText(folderPath, logWrite);
        }
    }
aquaMakc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранить экземпляр класса SkrudjMakdak Помощь студентам 0 23.10.2013 21:21
Как проверить null или сылка на объект не указывает на экземпляр объекта Kroshandowski Windows Forms 2 17.05.2013 11:50
Экземпляр класса в теле класса. Mr_freeman PHP 4 15.04.2013 15:37
По id создать экземпляр класса. [MI_nor] Общие вопросы по Java, Java SE, Kotlin 3 12.05.2011 03:33
Один экземпляр класса Лубышев Общие вопросы .NET 2 31.10.2008 20:57