WCF, выполняя События? - PullRequest
       4

WCF, выполняя События?

0 голосов
/ 08 марта 2011

Продолжая изучать WCF, я пытаюсь заставить его работать с событиями.

В этом примере, после нажатия кнопки в форме, я хочу, чтобы моя служба wcf выполнялась и событие, которое вызывало бы что-то в другой форме, подключенной к этой службе.

Это код для формы 1.

public Form1()
{
   InitializeComponent();
   client.TimeShowEvent += new EventHandler(TimeShowEvent);
   ///// SAYS THAT IT DOES NOT CONTAIN A DEFINITION FOR TimeShowEvent
}

MyWcfService1.IfaceServiceClient client = new MyWcfService1.IfaceServiceClient();

private void button2_Click(object sender, EventArgs e)
{
   try
   {
      MyWcfService1.IfaceServiceClient client = new MyWcfService1.IfaceServiceClient();
      client.passTime();
   }
   catch
   {
      MessageBox.Show("Service not availabe!");
   }
}

void TimeShowEvent(object sender, EventArgs e)
{
   textBox2.Text = client.timestring;
   //// SAYS THAT IT DOES NOT CONTAIN A DEFINITION FOR timestring
}

и за услугу:

namespace wcfLib
{
   [ServiceContract]
   public interface IfaceService
   {
       [OperationContract]
       int wordLen(string word);

       [OperationContract]
       string passTime();

        ///// DO I NEED TO SOMEHOW DECLARE THE VARIABLES ( timestring ) AND EVENTS ( TimeShowEvent ) HERE?
   }
}

Реализация сервиса:

public class StockService : IfaceService
{
    public event EventHandler TimeShowEvent;

    public string timestring = "none";

    public string passTime()
    {
        TimeShowEvent(this, new EventArgs());
        timestring = DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
        return "";
    }

    public int wordLen(string word)
    {
        return word.Length;
    }
}

Сервисное приложение хоста:

public class Service
{
    static void Main()
    {
        ServiceHost serviceHost = new ServiceHost(typeof(StockService), new Uri("http://localhost:8000/wcfLib"));
        serviceHost.AddServiceEndpoint(typeof(IfaceService), new BasicHttpBinding(), "");
        serviceHost.Open();
        Console.WriteLine("Press return to terminate the service");
        Console.ReadLine();
        serviceHost.Close();
    }
}

Нужно ли как-то объявлять события и переменные в [ServiceContract]? Это так, как? ...

Спасибо! :)

Ответы [ 2 ]

1 голос
/ 08 марта 2011

Попробуйте что-то вроде этого:

string timeString;

private void button2_Click(object sender, EventArgs e)
    {
        try
        {
            //You already declared client, so you don't need to do it again.

            //Assign the value from your wcf call to a local variable
            timeString = client.passTime();
        }
        catch
        {
            MessageBox.Show("Service not availabe!");
        }
    }

и измените службу, чтобы она возвращала строку:

public string passTime()
    {
        TimeShowEvent(this, new EventArgs());
        return DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");
    }

и ваше событие:

void TimeShowEvent(object sender, EventArgs e)
    {
        textBox2.Text = timeString;  //this is your local variable
    }

И вашОбработчик событий должен быть в клиенте.Служба wcf ничего не будет знать о событии, которое вызвало его или использовало его результат.

1 голос
/ 08 марта 2011

Когда вы создаете ссылку на службу для вашей службы, ваш клиент получает доступ к методам службы - и только к методам службы.

Обработчик событий TimeShowEvent в вашем классе реализации службы будет присутствовать и использоваться только на стороне сервера - он будет не доступен на стороне клиента.

Если вам нужно что-то вызвать, вам нужно определить другой метод службы - они «отражаются» в прокси-классе на стороне клиента - и только те.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...