Ничего не понимаю есть рабочее консольное приложение (по мотивам
[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>>
Ну что, никто не может обьяснить эту проблему???
... << RSDN@Home 1.2.0 alpha rev. 772>>
Здравствуйте, 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
Здравствуйте, 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>>