Отображение содержимого WCF в списке

У меня есть контракт службы WCF, который предназначен для отправки строки из буфера обмена через сеть TCP и получения и отображения в списке winform, мне удалось получить оба winforms, однако мне трудно получить URL-адрес для отображения в списке,

app.config

<!--?xml version="1.0" encoding="utf-8" ?-->
<configuration>
<system.servicemodel>
<bindings>
 <netpeertcpbinding>
 <binding name="NewBinding0">
 <security mode="None">
 <resolver mode="Pnrp">
 </resolver></security></binding>
 </netpeertcpbinding>
</bindings>
<client>
 <remove contract="IMetadataExchange" name="sb">
 </remove></client>
<services>
 <service name="WCFWinForm.ApplicationService">
 <endpoint address="net.p2p://URLService" binding="netPeerTcpBinding" bindingconfiguration="NewBinding0" contract="WCFWinForm.IApplicationService">
 </endpoint></service>
</services>
</system.servicemodel>
</configuration>

IApplicationService.cs

[ServiceContract]
public interface IApplicationService
{
 [OperationContract(IsOneWay = true)]
 void GetURL();
}

ApplicationService.cs

public class ApplicationService : IApplicationService
 {
 public void GetURL()
 {
 var addCopy = Clipboard.GetText(TextDataFormat.Text);
 WCF.listURL.Items.AddRange(addCopy.Split(new[] { Environment.NewLine }, StringSplitOptions.******************));
 }
 }

WCF.cs(Winform)

public static void WCF_Load(object sender, EventArgs e)
 {
 //Establish connection with Service
 ServiceHost svc = new ServiceHost(typeof(ApplicationService));
 svc.Credentials.Peer.MeshPassword = "hehe";
 svc.Open();

 //Both Server and Client binding should match
 NetPeerTcpBinding np2p = new NetPeerTcpBinding();

 np2p.Security.Mode = SecurityMode.None;
 }

 private void btnSendURL_MouseClick(object sender, EventArgs e)
 {
 ApplicationService url = new ApplicationService();
 url.GetURL();
 }

Вы можете заметить в ApplicationService.cs Я использую WCF.listURL, это потому, что я не знаю, как правильно вызвать список форм; listURL внутри ApplicationService.

1 ответ

Как я упоминал в своем комментарии, служба не должна ничего знать о клиенте, кроме запрашиваемых данных или какой-либо другой операции. Я бы рекомендовал переписать службу для возврата только данных и связать эти данные с клиентским приложением в ListBox. Однако вам нужно удалить атрибут IsOneWay. Что-то вроде этого:

[ServiceContract]
public interface IApplicationService
{

 [OperationContract]
 string GetURL();
}

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

public class ApplicationService : IApplicationService
{

 public string GetURL()
 {

 return Clipboard.GetText(TextDataFormat.Text);
 }
}

Реализация просто возвращает строку текста из буфера обмена.

private void btnSendURL_MouseClick(object sender, EventArgs e)
{

 ApplicationService url = new ApplicationService();
 string data = url.GetURL();

 listBox1.Items.AddRange(addCopy.Split(new[] { Environment.NewLine }, StringSplitOptions.******************));
}

Наконец, приложение вызовет метод службы и получит возвращаемые данные. Затем он добавит данные в ListBox (с именем listBox1 в примере). Теперь вы отключили свой WCF-сервис от своего клиента, как и должно быть.

licensed under cc by-sa 3.0 with attribution.