以下是Duplex Service及其WebConfig文件。在服務中,發送客戶端通過TransmitUserData方法發送它的數據並且接收客戶端通過來自CallBackContract的PublishUserData接收數據。WCF- System.ServiceModel.Channels.ServiceChannel已被中止
現在的問題是,如果我第一次運行客戶端它的工作完美,但如果我重新運行客戶端,它會給出以下錯誤傳輸。 Project can be found here.Here is the Service Log File (.svclog)
的通信對象,System.ServiceModel.Channels.ServiceChannel, 不能用於通信,因爲它已被中止。
雙工服務合同
[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; }
}
服務實現
[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>
編輯:
的代碼完全運行首次。 實際上問題是由Transmitter創建的,我們從不訂閱或取消訂閱。
是的,如果你可以在'nirajdoshi1985 [at] gmail [dot] com' – Marshal 2013-05-17 12:27:34
給我發送代碼,那就好了嗨Alex,謝謝你的代碼。它第一次運行完美,但是當我第二次運行時,變送器會導致問題(我們從不訂閱或取消訂閱)。請參閱編輯 – Marshal 2013-05-17 14:04:56
user1467261:再向前一步,如果我關閉接收器窗口,發射器會引發上述異常中止。不知怎的,頻道正在中止。 – Marshal 2013-05-17 14:19:16