首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解WCF IsOneWay、CalbackContracts和双工--我的假设正确吗?

理解WCF IsOneWay、CalbackContracts和双工--我的假设正确吗?
EN

Stack Overflow用户
提问于 2015-09-16 16:06:42
回答 1查看 6.2K关注 0票数 4

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

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

2:回调契约--这是返回到客户端的通信方法。

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

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

5:如果可以获得错误和soap信息,无效返回方法仍然会发送回复,如果是IsOneWay=true,则会忽略答复。^

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

了解WCF

使用IsOneWay属性的WCF问题

了解WCF客户端到服务器

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-16 21:26:45

看看WCF的本教程,以及双工服务上的MSDN条款

你的定义就快到了,我会把上面的定义定义为:

服务契约-定义web服务向客户端公开的操作的接口。

回调合同-类似于服务合同,但正如您注意到的,用于客户端。这定义了web服务如何作为单独的调用与客户端通信。(而不是简单地从服务合同中的调用返回数据)。它们通常用于从长期运行的web服务调用或事件信令返回值。

服务契约上的IsOneWay = true --这指定服务操作不返回值,因此客户端将简单地“触发和忘记”。对webservice的调用在客户端完成之前不会阻止它,而是立即返回。因此,使用IsOneWay = true的操作只能返回void。

回调合同上的IsOneWay = true --这与服务合同上的情况大致相同。当服务器调用回调契约上的操作时,它将立即返回,在操作完成之前不会阻塞。

虚空返回--如果IsOneWay未设置为true,则在操作完成之前,调用仍将被阻塞,SOAP消息仍将被返回,但没有数据(除非您正在传回错误)。如果您希望实际返回值,您可以这样做,就像使用常规方法一样,设置操作的返回类型,即

代码语言:javascript
复制
[ServiceContract]
public interface IService
{
    [OperationContract]
    DateTime GetDateTime();
}

public class Service : IService
{
    public DateTime GetDateTime()
    {
        return DateTime.Now;
    }
}

或者,您可以使用回调契约和IsOneWay = true创建一个双工服务。

代码语言:javascript
复制
[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. “超长操作”将在服务器上执行。
  3. 当服务器完成时,客户机上的GetDateTimeCompleted(DateTime dateTime)将被触发。

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32613623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档