[WCF] Обьясните
От: Dracula_DIS Россия  
Дата: 18.10.07 12:27
Оценка:
Ничего не понимаю есть рабочее консольное приложение (по мотивам [WCF] DuplexChannelFactory
Автор: Dracula_DIS
Дата: 14.10.07
):

namespace WCF_Simple
{
    class Program
    {
        static void Main(string[] args)
        {
            var _sh = new ServiceHost(typeof(_Server), new Uri[] { });
            _sh.AddServiceEndpoint(typeof(IServer), new NetTcpBinding(SecurityMode.None), "net.tcp://localhost:9000/wcfsimple");
            _sh.Open();
            var _client = new _Client();
            _client.Init();
        }
    }

    [ServiceContract(CallbackContract = typeof(IClient))]
    interface IServer
    {
        [OperationContract]
        Boolean Join(String Name);
    }

    [ServiceContract]
    interface IClient
    {
        [OperationContract]
        void onJoin(String Name);

        [OperationContract]
        void Init();
    }

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
    class _Server : IServer
    {
        public bool Join(string Name)
        {
            var newUser = OperationContext.Current.GetCallbackChannel<IClient>();
            newUser.onJoin(Name);
            return true;
        }
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    class _Client : IClient
    {
        public void onJoin(String Name)
        {
        }

        DuplexChannelFactory<IServer> _dcf;
        IServer _server;

        public void Init()
        {
            _dcf = new DuplexChannelFactory<IServer>(typeof(IServer), new NetTcpBinding(SecurityMode.None));
            _server = _dcf.CreateChannel(new InstanceContext(this), new EndpointAddress("net.tcp://localhost:9000/wcfsimple"));
            var b = _server.Join("myName");
        }
    }
}


Копирую ТОТЖЕ код в WinForm приложение и не хочет работать:

namespace WCFs
{

    public partial class Client : Form
    {
        public Client()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var _sh = new ServiceHost(typeof(_Server), new Uri[] { });
            _sh.AddServiceEndpoint(typeof(IServer), new NetTcpBinding(SecurityMode.None), "net.tcp://localhost:9000/wcfsimple");
            _sh.Open();
            var _client = new _Client();
            _client.Init();
        }
    }

    [ServiceContract(CallbackContract = typeof(IClient))]
    interface IServer
    {
        [OperationContract]
        Boolean Join(String Name);
    }

    [ServiceContract]
    interface IClient
    {
        [OperationContract]
        void onJoin(String Name);

        [OperationContract]
        void Init();
    }

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single)]
    class _Server : IServer
    {
        public bool Join(string Name)
        {
            var newUser = OperationContext.Current.GetCallbackChannel<IClient>();
            newUser.onJoin(Name);
            return true;
        }
    }

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
    class _Client : IClient
    {
        public void onJoin(String Name)
        {
        }

        DuplexChannelFactory<IServer> _dcf;
        IServer _server;

        public void Init()
        {
            _dcf = new DuplexChannelFactory<IServer>(typeof(IServer), new NetTcpBinding(SecurityMode.None));
            _server = _dcf.CreateChannel(new InstanceContext(this), new EndpointAddress("net.tcp://localhost:9000/wcfsimple"));
            var b = _server.Join("myName");// Тут вылетает по таймауту
        }
    }
}


Обьясните плиз в чем разница??? почему первый код работает а второй нет??
... << RSDN@Home 1.2.0 alpha rev. 772>>
Say I...
Re: [WCF] Обьясните
От: Dracula_DIS Россия  
Дата: 21.10.07 05:24
Оценка:
Ну что, никто не может обьяснить эту проблему???
... << RSDN@Home 1.2.0 alpha rev. 772>>
Say I...
Re: [WCF] Обьясните
От: AlexML Россия  
Дата: 21.10.07 14:58
Оценка:
Здравствуйте, Dracula_DIS, Вы писали:

D_D>Ничего не понимаю есть рабочее консольное приложение (по мотивам [WCF] DuplexChannelFactory
Автор: Dracula_DIS
Дата: 14.10.07
):

D_D>Обьясните плиз в чем разница??? почему первый код работает а второй нет??

Разница в использовании потоков. Изучение трассировки показало информацию:
Переключение потоков во время обработки сообщения для контракта "IServer" по адресу "net.tcp://localhost:9000/wcfsimple". Свойство UseSynchronizationContext атрибута ServiceBehaviorAttribute имеет значение true, а при открытии ServiceHost параметр SynchronizationContext.Current имел ненулевое значение. Если кажется, что служба не обрабатывает сообщения, установите значение false для UseSynchronizationContext

Таким образом включение атрибута UseSynchronizationContext решило проблему и сервер отозвался.
Вообщем включай трассировку и найдешь проблему.
ЗЫ
Сообщение трассировки по русски, т.к. установлена русская Vista

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]
public class _Server : IServer
Re[2]: [WCF] Обьясните
От: Dracula_DIS Россия  
Дата: 23.10.07 09:12
Оценка:
Здравствуйте, AlexML, Вы писали:

AML>Таким образом включение атрибута UseSynchronizationContext решило проблему и сервер отозвался.

AML>Вообщем включай трассировку и найдешь проблему.
AML>ЗЫ
AML>Сообщение трассировки по русски, т.к. установлена русская Vista

AML>
AML>[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.Single, UseSynchronizationContext = false)]
AML>public class _Server : IServer
AML>


К сожалению использование UseSynchronizationContext = false не превело к желаемым результатам
... << RSDN@Home 1.2.0 alpha rev. 772>>
Say I...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.