【问题标题】:Understanding WCF IsOneWay, CalbackContracts and Duplex - Are my assumptions correct?了解 WCF IsOneWay、CalbackContracts 和 Duplex - 我的假设是否正确?
【发布时间】:2015-12-13 08:04:45
【问题描述】:

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

1:服务契约 - 这是客户端必须与服务建立的通信路径。

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

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

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

5: void return 方法仍然会返回一个回复,如果 IsOneWay=true,则忽略该回复,如果 false 可以获取错误和soap信息。 ^

为简洁起见,我查看了以下内容,然后查看了一些^ⁿ:

Understanding WCF

WCF issue with using IsOneWay attribute

Understanding WCF Client to Server

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

【问题讨论】:

    标签: c# wcf soap duplex


    【解决方案1】:

    看看this tutorial 用于 WCF,这个MSDN Article 用于双工服务。

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

    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>();
        }
    }
    

    使用这种方法:

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

    请注意,上述双工示例并不完整,您需要确保正确处理会话等内容。

    您绝对是在正确的轨道上。我建议遵循上面链接的教程(以及您找到的任何其他教程)并进行试验。您很快就会对可能发生的事情有一个很好的感觉。

    【讨论】:

    • 服务契约可以返回值,但是如果操作是异步的 - 使用回调契约返回值是有意义的。 @Ahhhhbisto 准确吗?
    • 这是一种用途,是的。如果IsOneWay = true 则客户端调用将立即返回,您可以通过回调合约返回值。还有其他更好的方法来实现异步方法。例如,Svcutil 可以从常规服务合同创建 TAP 或事件驱动的异步操作。你可以在这里找到一个简单的例子:adndevblog.typepad.com/cloud_and_mobile/2012/09/…
    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2013-02-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多