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

1:服务契约——这是客户必须对服务进行的通信路径。

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

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

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

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

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

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

最佳答案

看看 WCF 的 this tutorial,以及双工服务上的 MSDN Article

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

服务契约(Contract) - 定义 Web 服务向客户端公开的操作的接口(interface)。

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

服务契约(Contract)上的 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;
    }
}

或者,您可以创建一个双工服务,带有回调契约(Contract)和 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() 操作将立即返回
  • “非常长的操作”将在服务器上执行
  • 当服务器完成时,客户端上的 GetDateTimeCompleted(DateTime dateTime) 将被触发。

  • 请注意,上面的双工示例并不完整,您需要确保正确处理 session 之类的事情。

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

    关于c# - 了解 WCF IsOneWay、CalbackContracts 和 Duplex - 我的假设是否正确?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32613623/

    10-11 20:35