XeeShaN AbbAs Ответов: 2

Узел WCF в приложении Windows Form


хиии
Я новичок в WCF и написал код в консольном приложении, которое отлично работает.
Теперь я попробую преобразовать его в приложение Windows Form.

Я создал такую услугу, как эта
[ServiceContract]
public interface IHelloService
{
    [OperationContract]
    void SayHello(string msg);
}


и определите функцию
public partial class Form1 : IHelloService
   {
       public string SayHello(string msg)
       {
           richTextBox1.Text=msg;
           return "Service on " + Environment.MachineName + " rec. " + msg;
}
   }


И я создал класс Form1 с простым richTextBox1
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            RichTextBox richTextBox1=new RichTextBox;
        }
    } 

и я запускаю сервис из основного файла программы
static void Main(string[] args)
        {
            using(ServiceHost host = new ServiceHost(typeof(Form1)))
            {
            
                host.AddServiceEndpoint(typeof(IHelloService), new NetTcpBinding(), "net.tcp://localhost:9000/HelloWcfService");
                host.Open();
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }

        }


Теперь проблема заключается в том, что хост WCF получает данные, но не отображается в richTextBox1
Спасибо

2 Ответов

Рейтинг:
1

Member 2526560

Это ниже работает нормально:

public partial class Form1 : Form
    {
        [ServiceContract]
        public interface IHelloWorldService
        {
            [OperationContract]
            string SayHello(string name);
        }

        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string name)
            {
                return string.Format("Hello, {0}", name);
            }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Loading(object sender, EventArgs e)
        {
            Uri baseAddress = new Uri("http://localhost:8758/hello");

            // Create the ServiceHost.
            ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress);
            
			ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
			smb.HttpGetEnabled = true;
			smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
			host.Description.Behaviors.Add(smb);
			host.Open();
		
        }
    }


Рейтинг:
0

Sergey Alexandrovich Kryukov

Если вам удалось разработать автономную функциональность WCF, то на самом деле ничего не изменится, если вы хотите, чтобы служебная часть была System.Windows.Forms приложение. WCF не имел бы никакого значения, если бы он был переплетен с определенными типами пользовательского интерфейса и чем-либо еще, не связанным с коммуникационными технологиями.

С вашим контрактом на обслуживание это выглядит так, как будто вы хотите показать строку, предоставленную клиентом в RichTextBox который находится на стороне обслуживания.
Просто повторно внедрите свой контрактный метод.

Например, предположим, что у вас есть форма:

using System.Windows.Forms;

//...

public partial class MyForm : Form {
    RichTextBox MyRichTextBox = new RichTextBox();
    //...
}


Реализуйте свой сервисный интерфейс в этой форме. Например, добавьте отдельный файл с другой частью частичного объявления:

public partial class MyForm : IHelloService {
    void IHelloService.SayHello(string msg) {
        MyRichTextBox.Text = msg;
        //or better: 
        //MyRichTextBox.Rtf = msg; //and pass formatted RTF text
    }
}


Обратите внимание: вам не нужно повторять ": Form" и ": IHelloService" в списках наследования обоих частичных объявлений классов — это не нужно, что очень удобно. Кроме того, я сделал реализацию интерфейса непубличной, используя явный синтаксис реализации (где любой модификатор доступа не разрешен). Этот синтаксис намного лучше, так как никто не может вызвать метод IHelloService.SayHello случайно.

—СА


XeeShaN AbbAs

Спасибо за вашу помощь я реализовал свой код как вы сказали теперь мой код выглядит так
<pre lang="c#">

[ServiceContract]
публичный интерфейс IHelloService
{
[OperationContract]
строка SayHello(строка msg);
}
пространство имен HelloWcfServiceHost
{
публичный частичный класс Form1 : IHelloService
{
строка IHelloService.SayHello(строка msg)
{
richtextbox1 отображение.Текст = сообщение;
вернуть сообщение;
}
}
общественности частичного класс form1 : форма
{
открытый form1()
{
метод InitializeComponent();
}

частный недействительными методе form1_load(объект отправителя, EventArgs в электронной)
{
используя (метод servicehost узел = новый метод servicehost(typeof на(файл form1)))
{
хозяин.AddServiceEndpoint(typeof(IHelloService), new NetTcpBinding(), "net.tcp://localhost:9000/HelloWcfServiceHost");
хозяин.Открыть();

}
}
}


}
</pre>

это работает успешно, но теперь мой клиент wcf не работает через исключение того, что хост не работает.

мой код на стороне клиента таков

<pre lang="c#">
IHelloService proxy = ChannelFactory<ihelloservice>.Класса createchannel(новые привязки nettcpbinding(), новый адрес endpointaddress("чистые.протокол TCP://имя localhost:9000/HelloWcfServiceHost"));
строковое сообщение;
msg = прокси.Метод sayHello(текстовое поле textbox1.Текст);
</pre>

Sergey Alexandrovich Kryukov

Вам лучше добавить этот код, используя "улучшить вопрос", чтобы вы могли сохранить форматирование, которое вы не могли сделать в комментарии; во всех случаях не помещайте его в решение.

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

Если это все еще проблема, не стесняйтесь задавать следующий вопрос.
--СА

XeeShaN AbbAs

спасибо за ваш ответ...
я улучшил свой вопрос.
не могли бы вы взглянуть на это для меня?..