Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 了解WCF IsOneWay、CalbackContracts和Duplex-我的假设正确吗?_C#_Wcf_Soap_Duplex - Fatal编程技术网

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

C# 了解WCF IsOneWay、CalbackContracts和Duplex-我的假设正确吗?,c#,wcf,soap,duplex,C#,Wcf,Soap,Duplex,我一直在阅读和试验WCF,并试图用简单的术语理解其工作原理。因此,我的问题是为了验证我认为是正确的,但我需要确定: 在典型的发布-订阅双工服务中 1:服务合同-这是客户端必须与服务进行通信的路径 2:回调契约-这是返回到客户端的通信方法 3:在回调合约上设置IsOneWay=true属性意味着客户机将不会从服务器获取任何信息 4:在ServiceContract上设置IsOneWay=true意味着服务器将不会从客户端得到任何东西 5:void return方法仍然发送回复,如果IsOneWay

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

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

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

3:在回调合约上设置IsOneWay=true属性意味着客户机将不会从服务器获取任何信息

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

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

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

看看WCF,这是关于双工服务的

你的定义就快到了,我自己将上面的定义定义为:

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

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

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

回调合同上的
IsOneWay=true
——这与服务合同上的情况基本相同。当服务器调用回调协定上的操作时,它将立即返回,并且在操作完成之前不会阻塞

Void returns-如果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>();
    }
}
[ServiceContract(CallbackContract=typeof(ICallbackService))]
公共接口设备
{
[运营合同(IsOneWay=true)]
void GetDateTime();
}
公共接口ICallbackService
{
[运营合同(IsOneWay=true)]
作废GetDateTimeCompleted(日期时间日期时间);
}
公共课服务:IService
{
public void GetDateTime()
{
//在这里做长动作。
...
Callback.GetDateTimeCompleted(DateTime.Now);
} 
ICallbackService回调
{
返回OperationContext.Current.GetCallbackChannel();
}
}
使用此方法:

  • 对webservice
    GetDateTime()
    操作的调用将立即返回
  • “非常长的操作”将在服务器上执行
  • 当服务器完成时,将触发客户端上的
    GetDateTimeCompleted(DateTime DateTime)
  • 请注意,上面的双工示例并不完整,您需要确保正确处理会话之类的事情


    你肯定走对了路。我建议遵循上面链接的教程(以及您找到的任何其他教程)并进行实验。您很快就会对可能的情况有一个良好的感觉。

    服务契约可以返回值,但是如果操作是异步的,那么使用回调契约返回值是有意义的@这准确吗?这是一个用途,是的。如果
    IsOneWay=true
    ,则客户端调用将立即返回,您可以通过回调契约返回值。还有其他更好的方法来实现异步方法。例如,Svcutil可以从常规服务契约创建TAP或事件驱动的异步操作。您可以在这里找到一个简单的示例: