理解WCF是单向的,回调契约和双工-我的假设是正确的吗?

本文关键字:假设 我的 WCF 回调 理解 契约 | 更新日期: 2023-09-27 18:13:06

我一直在阅读和试验WCF,并试图用简单的术语理解其工作原理。所以我的问题是为了验证和确认我认为是正确的但我需要确定在典型的发布-订阅双工服务中。

1:服务契约——这是客户端与服务之间的通信路径。

2:回调合约——这是回发给客户端的通信方法。

3:在回调合约上设置IsOneWay = true属性意味着客户端将不会从服务器获得任何返回。

4:在ServiceContract上设置IsOneWay = true意味着服务器将不会从客户端获得任何返回。

5: void返回方法仍然发送一个应答返回,如果IsOneWay=true,则应答被忽略,如果为false,则可以获得错误和soap信息。^

为简洁起见,我看了以下内容,然后是Some^ n ^ n:

WCF

的理解

使用IsOneWay属性的WCF问题

了解WCF客户端到服务器

https://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.isoneway (v = vs.110) . aspx

理解WCF是单向的,回调契约和双工-我的假设是正确的吗?

看一下WCF教程,以及这篇关于双工服务的MSDN文章。

你的定义差不多了,我自己将上述定义为:

Service Contract——定义web服务向客户端公开的操作的接口。

回调契约-类似于服务契约,但如您所注意的,是针对客户端的。这定义了web服务如何作为单独的调用与客户机通信。(而不是简单地从服务契约中的调用返回数据)。这些通常用于从长时间运行的web服务调用或事件信令返回值。

服务契约上的

IsOneWay = true -这指定服务操作不返回值,因此客户端将简单地"解雇并忘记"。对web服务的调用在完成之前不会阻塞客户端,而是立即返回。由于这个原因,使用IsOneWay = true的操作只能返回void。

回调契约上的

IsOneWay = true -这与服务契约上的内容大致相同。当服务器调用回调合约上的操作时,它将立即返回,直到操作完成才会阻塞。

Void返回——如果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>();
    }
}

使用此方法:

    对webservice GetDateTime()操作的调用将立即返回
  1. "非常长的操作"将在服务器上执行
  2. 客户端的GetDateTimeCompleted(DateTime dateTime)将在服务端完成时被触发。

请注意,上面的双工示例是不完整的,您需要确保您正确地处理会话之类的事情。

你绝对是在正确的轨道上。我建议您按照上面链接的教程(以及您找到的任何其他教程)进行实验。你很快就会对什么是可能的感觉很好。