听起来您正在寻找的只是通过在操作合同上设置 IsOneWay=true 启用的行为。当您在操作合约中设置 IsOneWay=true 时,调用方会发送请求但不会等待响应。为了得到您的响应,被调用者需要在您的双工通道的回调通道上调用另一个操作,该通道也设置了 IsOneWay=true。
这是一个简单的示例:
服务合约:
[ServiceContract( CallbackContract = typeof( IClientCallback ), SessionMode = SessionMode.Required )]
public interface IClientService
{
[OperationContract( IsInitiating = true )]
void CreateSession( string windowsUserName );
[OperationContract( IsOneWay = true )]
void LongOp( );
[OperationContract( IsTerminating = true )]
void Terminate( );
}
客户端回调合约:
[ServiceContract]
public interface IClientCallback
{
[OperationContract( IsOneWay = true )]
void LongOpResponse( );
}
服务实施:
class ServerService : IClientService
{
public void CreateSession( string windowsUserName )
{
//Do stuff to set up your session as desired
}
public void LongOp( )
{
//Do something that takes a long time
LongRunningFunctionCall();
Callback.LongOpResponse();
}
public void Terminate( )
{
//Do stuff to tear down your session
}
public IClientCallback Callback { get { return OperationContext.Current.GetCallbackChannel<IClientCallback>( ); } }
}
客户端回调实现:
class CallbackHandler : IClientCallback
{
public void LongOpResponse( )
{
Console.WriteLine( "Received long operation response from server." );
}
}
只要您拥有对处理每个会话的客户端服务对象的引用,您就可以直接通过该对象访问其回调通道,因此您可以从服务器应用程序中的任何点启动回调合约上的函数,只要通道是开放的。
我们通常会在双工通道的服务合同中完成比 IsOneWay=false 更多的单向操作,除了立即响应对调用应用程序的继续至关重要的操作。