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

时间:2015-09-16 16:06:43

标签: c# wcf soap duplex

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

1:服务合同 - 这是客户必须对服务进行的通信路径。

2:回调合约 - 这是回馈给客户的沟通方法。

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

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

5:void返回方法仍然发送回复,如果IsOneWay = true,则忽略回复,如果可以获得错误错误和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

1 个答案:

答案 0 :(得分:3)

在WCF上查看this tutorial,在双工服务上查看此MSDN Article

你几乎与你的定义在一起,我将上面的定义为:

服务合同 - 定义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. 对webservice GetDateTime()操作的调用将立即返回
  2. &#34;非常长的操作&#34;将在服务器上执行
  3. 当服务器完成时,客户端上的GetDateTimeCompleted(DateTime dateTime)将被触发。
  4. 请注意,上述双面打印示例不完整,您需要确保正确处理会话等事项。

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