C# 了解WCF IsOneWay、CalbackContracts和Duplex-我的假设正确吗?
我一直在阅读和试验WCF,并试图用简单的术语理解其工作原理。因此,我的问题是为了验证我认为是正确的,但我需要确定: 在典型的发布-订阅双工服务中 1:服务合同-这是客户端必须与服务进行通信的路径 2:回调契约-这是返回到客户端的通信方法 3:在回调合约上设置IsOneWay=true属性意味着客户机将不会从服务器获取任何信息 4:在ServiceContract上设置IsOneWay=true意味着服务器将不会从客户端得到任何东西 5:void return方法仍然发送回复,如果IsOneWay=true,则忽略回复,如果可以获得false错误和soap信息 为了简单起见,我看了以下内容,然后是一些^ⁿ: 看看WCF,这是关于双工服务的 你的定义就快到了,我自己将上面的定义定义为: 服务契约-定义web服务向客户端公开的操作的接口 回调契约-类似于服务契约,但正如您所注意到的,是针对客户端的。这定义了web服务如何作为单独的调用与客户端通信。(而不是简单地从服务合同中的调用返回数据)。它们通常用于从长时间运行的web服务调用或事件信令返回值 服务合同上的C# 了解WCF IsOneWay、CalbackContracts和Duplex-我的假设正确吗?,c#,wcf,soap,duplex,C#,Wcf,Soap,Duplex,我一直在阅读和试验WCF,并试图用简单的术语理解其工作原理。因此,我的问题是为了验证我认为是正确的,但我需要确定: 在典型的发布-订阅双工服务中 1:服务合同-这是客户端必须与服务进行通信的路径 2:回调契约-这是返回到客户端的通信方法 3:在回调合约上设置IsOneWay=true属性意味着客户机将不会从服务器获取任何信息 4:在ServiceContract上设置IsOneWay=true意味着服务器将不会从客户端得到任何东西 5:void return方法仍然发送回复,如果IsOneWay
IsOneWay=true
-这指定服务操作不返回任何值,因此客户端将简单地“触发并忘记”。对webservice的调用在客户端完成之前不会阻止客户端,而是立即返回。因此,使用IsOneWay=true
的操作只能返回void
回调合同上的IsOneWay=true
——这与服务合同上的情况基本相同。当服务器调用回调协定上的操作时,它将立即返回,并且在操作完成之前不会阻塞
Void returns-如果IsOneWay未设置为true,调用仍将阻塞,直到操作完成,仍将返回SOAP消息,但不返回任何数据(除非您正在传回错误)。如果您希望实际返回值,您可以像使用普通方法一样,设置操作的返回类型,即
[ServiceContract]
public interface IService
{
[OperationContract]
DateTime GetDateTime();
}
public class Service : IService
{
public DateTime GetDateTime()
{
return DateTime.Now;
}
}
或者,您可以创建一个具有回调协定的双工服务,并且IsOneWay=true
[ServiceContract(CallbackContract = typeof(ICallbackService))]
public interface IService
{
[OperationContract(IsOneWay = true)]
void GetDateTime();
}
public interface ICallbackService
{
[OperationContract(IsOneWay = true)]
void GetDateTimeCompleted(DateTime dateTime);
}
public class Service : IService
{
public void GetDateTime()
{
// Do long action here.
...
Callback.GetDateTimeCompleted(DateTime.Now);
}
ICallbackService Callback
{
return OperationContext.Current.GetCallbackChannel<ICallbackService>();
}
}
[ServiceContract(CallbackContract=typeof(ICallbackService))]
公共接口设备
{
[运营合同(IsOneWay=true)]
void GetDateTime();
}
公共接口ICallbackService
{
[运营合同(IsOneWay=true)]
作废GetDateTimeCompleted(日期时间日期时间);
}
公共课服务:IService
{
public void GetDateTime()
{
//在这里做长动作。
...
Callback.GetDateTimeCompleted(DateTime.Now);
}
ICallbackService回调
{
返回OperationContext.Current.GetCallbackChannel();
}
}
使用此方法:
GetDateTime()
操作的调用将立即返回GetDateTimeCompleted(DateTime DateTime)
你肯定走对了路。我建议遵循上面链接的教程(以及您找到的任何其他教程)并进行实验。您很快就会对可能的情况有一个良好的感觉。服务契约可以返回值,但是如果操作是异步的,那么使用回调契约返回值是有意义的@这准确吗?这是一个用途,是的。如果
IsOneWay=true
,则客户端调用将立即返回,您可以通过回调契约返回值。还有其他更好的方法来实现异步方法。例如,Svcutil可以从常规服务契约创建TAP或事件驱动的异步操作。您可以在这里找到一个简单的示例: