Отображение содержимого 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.