c # WCF host.open терпит неудачу - PullRequest
0 голосов
/ 05 июня 2009

Я делаю приложение WPF, и оно также является сервером WCF, у меня проблема в том, что мне нужно, чтобы ServiceHost был открыт и прослушивал порт для клиентов и принимал запросы, как только он запускается, но проблема У меня есть то, что, если я пишу код для открытия узла host.open в конструкторе после функции this.InitializeComponent () , он завершается ошибкой с исключением. Если я открываю хост в кнопке и нажимаю его после запуска приложения, оно работает без проблем.

Почему и как я могу решить эту проблему?

Я использую канал tcp.net, размещаю его в приложении, и получаю исключение, касающееся службы, которая уже была зарегистрирована.

Исключение для клиентов:

внутреннее сообщение об исключении: «Существующий соединение было принудительно закрыто удаленный хост "
номер ошибки: 10054
Ошибка сокета: System.Net.Sockets.SocketError.ConnectionReset

спасибо

Уолли

конструктор:

public Window1()
{
   this.InitializeComponent();
   starthost();  
}

private void starthost()
{
   host = new ServiceHost(typeof (Window1), 
                           new Uri[]{ new Uri("net.tcp://localhost:8000") });

   host.AddServiceEndpoint(typeof(IGanador), new NetTcpBinding(), "Contador");
   host.open(); //it fails with this line here but not in a button 
}

Ответы [ 3 ]

3 голосов
/ 06 июня 2009

Так я правильно понял? Ваш "Window1" является классом окон WPF, который реализует сервисный контракт IGanador? Это кажется немного странным ... как насчет создания собственного класса, например «ГанадорСервис», который реализует IContador? Затем этот CLASS будет создан / создан для каждого запроса, а не для вашего окна.

public Window1()
{
   this.InitializeComponent();
   starthost();  
}

private void starthost()
{
   host = new ServiceHost(typeof (GanadorService), 
                           new Uri[]{ new Uri("net.tcp://localhost:8000") });

   host.AddServiceEndpoint(typeof(IGanador), new NetTcpBinding(), "Contador");
   host.open(); //it fails with this line here but not in a button 
}


public class GanadorService : IGanador
{
   .... (whatever methods you need) .....
}

Надеюсь, это должно помочь!

Марк

0 голосов
/ 02 июня 2016
  1. При использовании типа контракта сообщения в качестве параметра, только один параметр может использоваться в операции «Операция»

    [OperationContract]
    void SaveEmployeeDetails(EmployeeDetails emp);
    
  2. Сервисная операция должна либо возвращать тип Messagecontract, либо она не должна возвращать никакого значения

    [OperationContract]
    EmployeeDetails GetEmployeeDetails();
    
  3. Сервисная операция примет и вернет только сообщение типа контракта. Другие типы данных не допускаются.

    [OperationContract]
    EmployeeDetails ModifyEmployeeDetails(EmployeeDetails emp);
    

Примечание. Если тип имеет контракт на сообщение и данные, сервисная операция будет принимать только контракт на сообщение.

0 голосов
/ 06 июня 2009

Привет
Я решил проблему, большое спасибо комментариям marc_s
Я создал единый сервисный хост
добавив следующий атрибут в мое окно1

[ServiceBehavior (InstanceContextMode = InstanceContextMode.Single)]

и передать это в конструкторе:

хост = новый ServiceHost ( этот , новый Ури [] { новый Uri ("net.tcp: // localhost: 8000});

это прекрасно работает, потому что у меня все равно есть только один клиент

спасибо
Это ссылка с отличной статьей с описанием управления экземпляром WCF:

http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

...