Ниже приведена служба двусторонней печати и файл WebConfig. В этой услуге передающий клиент отправляет данные через метод TransmitUserData, и принимающий клиент получает данные через PublishUserData из CallBackContract.WCF-System.ServiceModel.Channels.ServiceChannel отменен
Теперь проблема заключается в том, что если я запускаю клиентов в первый раз, он отлично работает, но если я повторно запустил клиентов, он даст следующую ошибку в то время как Передача. Project can be found here.Here is the Service Log File (.svclog)
Объект связи, System.ServiceModel.Channels.ServiceChannel, не может быть использована для обмена данными, поскольку она была прервана.
Duplex Сервисный контракт
[ServiceContract(CallbackContract=typeof(IContactManagerCallBackService))]
public interface IContactManagerUserService
{
[OperationContract(IsOneWay = true)]
void SubscribeAsReceiver();
[OperationContract(IsOneWay = true)]
void SubscribeAsTransmitter();
[OperationContract]
void TransmitUserData(UserInfo info);
}
[ServiceContract]
public interface IContactManagerCallBackService
{
[OperationContract(IsOneWay = true)]
void PublishUserData(UserInfo info);
}
[DataContract]
public class UserInfo
{
[DataMember]
public bool PaidUser { get; set; }
[DataMember]
public string ProfileName{ get; set;}
[DataMember]
public string ComputerName { get; set; }
[DataMember]
public string IPAddress { get; set; }
[DataMember]
public string MACAddress { get; set; }
}
Внедрение Service
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class ContactManagerUserService : IContactManagerUserService
{
SynchronizedCollection<IContactManagerCallBackService> receiverClients;
public ContactManagerUserService()
{
receiverClients = new SynchronizedCollection<IContactManagerCallBackService>();
}
public void SubscribeAsReceiver()
{
IContactManagerCallBackService client = OperationContext.Current.GetCallbackChannel<IContactManagerCallBackService>();
receiverClients.Add(client);
}
public void TransmitUserData(UserInfo info)
{
foreach (IContactManagerCallBackService receiverClient in receiverClients)
{
receiverClient.PublishUserData(info);
}
}
Web.config
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true"
logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<bindings>
<netTcpBinding>
<binding name="NewBinding0" maxConnections="1000"
portSharingEnabled="true">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="ContactManagerService.ContactManagerUserService">
<endpoint address="mex" binding="netTcpBinding" bindingConfiguration=""
name="dataEndPoint" contract="ContactManagerService.IContactManagerUserService" />
<endpoint binding="mexTcpBinding" bindingConfiguration="" name="mexHttp"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost/ContactManagerUserService" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="false" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
Edit:
код отлично работает в первый раз. На самом деле проблема возникает с помощью передатчика, который мы никогда не подписываемся и не подписываемся.
Да, было бы неплохо, если бы вы могли отправить мне код на 'nirajdoshi1985 [at] gmail [dot] com' – Marshal
Привет, Алекс, спасибо за код. Он работает отлично в первый раз, но когда я запускаю его во второй раз, Transmitter вызывает проблему (которую мы никогда не подписываем или не подписываем). См. Edit – Marshal
user1467261: Еще один шаг вперед, если я закрываю окно приемника, передатчик выдает исключенное выше исключение. Каким-то образом канал прерывается. – Marshal