繁体   English   中英

了解WCF IsOneWay,CalbackContracts和Duplex-我的假设正确吗?

[英]Understanding WCF IsOneWay, CalbackContracts and Duplex - Are my assumptions correct?

我一直在阅读和尝试WCF,并尝试以简单的方式理解其工作原理。 因此,我的问题是对我认为正确的内容进行验证和确认,但我需要确保:在典型的发布-订阅双工服务中。

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

2:回调合同-这是与客户端的通信方法。

3:在回调合同上设置IsOneWay = true属性意味着客户端将不会从服务器取回任何东西。

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

5:void返回方法仍会返回答复,如果IsOneWay = true,则可以忽略该答复,如果可以获取错误错误和肥皂信息。 ^

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

了解WCF

使用IsOneWay属性的WCF问题

了解WCF客户端到服务器

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

看看有关WCF的本教程以及有关双工服务的MSDN文章

您的定义几乎就在那里,我自己将以上定义为:

服务合同-定义Web服务向客户端公开的操作的接口。

回调合同-类似于服务合同,但请注意,该协议是针对客户端的。 这定义了Web服务如何作为单独的调用与客户端通信。 (与仅从服务合同中的调用返回数据相反)。 这些通常用于从长时间运行的Web服务调用或事件信令中返回值。

服务合约上的IsOneWay = true这指定服务操作不返回任何值,因此客户端将简单地“解雇”。 对Web服务的调用在完成之前不会阻塞客户端,而是立即返回。 因此, IsOneWay = true操作只能返回void。

回调合同上的IsOneWay = true这与服务合同上的相同。 当服务器调用回调合同上的操作时,它将立即返回并且直到操作完成才阻塞。

无效返回-如果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. 对Web服务GetDateTime()操作的调用将立即返回
  2. “非常长时间的操作”将在服务器上执行
  3. 服务器完成时,将触发客户端上的GetDateTimeCompleted(DateTime dateTime)

请注意,上述双工示例尚未完成,您需要确保正确处理了会话之类的内容。

您肯定在正确的轨道上。 我建议遵循上面链接的教程(以及发现的其他教程)并进行实验。 您很快就会对可能发生的事情有很好的感觉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM