了解 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 return 方法仍然发送回复,如果 IsOneWay=true,回复被忽略,如果为 false 错误和 soap 信息可以获得。 ^
为简洁起见,我查看了以下内容,然后查看了一些^ⁿ:
Understanding WCF
Understanding WCF Client to Server
查看 this tutorial for WCF, and this MSDN Article 双工服务。
你的定义差不多了,我自己将上面的定义为:
服务契约 - 定义 Web 服务向客户端公开的操作的接口。
回调合同 - 类似于服务合同,但正如您所注意到的,是针对客户端的。这定义了 Web 服务如何作为单独的调用与客户端通信。 (与简单地 return 从服务合同中的调用中获取数据相反)。这些通常用于 returning 来自长运行 网络服务调用或事件信号的值。
IsOneWay = true
在服务合同上 - 这指定服务操作 return 没有价值,因此客户端将简单地 "fire and forget"。对 web 服务的调用在完成之前不会阻塞客户端,而是立即 return。因此,使用 IsOneWay = true
的操作只能 return 无效。
IsOneWay = true
在回调合同上——这与在服务合同上的非常相似。当服务器调用回调合约上的操作时,它会立即return并且不会阻塞直到操作完成。
Void returns - 如果 IsOneWay 未设置为 true,调用仍将阻塞直到操作完成,SOAP 消息仍将 returned,但没有数据(除非你正在传回故障)。如果您希望实际 return 值,您可以像使用普通方法一样完全这样做,设置操作的 return 类型,即
[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>();
}
}
使用此方法:
- 调用 web 服务
GetDateTime()
操作会立即 return
- "Very long operation" 将在服务器上执行
- 客户端上的
GetDateTimeCompleted(DateTime dateTime)
将在服务器完成时触发。
请注意,上面的双工示例并不完整,您需要确保正确处理会话等内容。
你绝对是在正确的轨道上。我建议遵循上面链接的教程(以及您找到的任何其他教程)并进行试验。您很快就会明白什么是可能的。
我一直在阅读和试验 WCF,并试图以简单的方式理解其工作原理。所以我的问题是验证和验证我认为正确的内容,但我需要确定: 在典型的发布-订阅双工服务中。
1:服务契约 - 这是客户端必须与服务建立的通信路径。
2:回调契约——这是返回给客户端的通信方式。
3: 在回调合同上设置 IsOneWay = true 属性 意味着客户端不会从服务器返回任何内容。
4: 在 ServiceContract 上设置 IsOneWay = true 意味着服务器不会从客户端返回任何东西。
5: void return 方法仍然发送回复,如果 IsOneWay=true,回复被忽略,如果为 false 错误和 soap 信息可以获得。 ^
为简洁起见,我查看了以下内容,然后查看了一些^ⁿ:
Understanding WCF
Understanding WCF Client to Server
查看 this tutorial for WCF, and this MSDN Article 双工服务。
你的定义差不多了,我自己将上面的定义为:
服务契约 - 定义 Web 服务向客户端公开的操作的接口。
回调合同 - 类似于服务合同,但正如您所注意到的,是针对客户端的。这定义了 Web 服务如何作为单独的调用与客户端通信。 (与简单地 return 从服务合同中的调用中获取数据相反)。这些通常用于 returning 来自长运行 网络服务调用或事件信号的值。
IsOneWay = true
在服务合同上 - 这指定服务操作 return 没有价值,因此客户端将简单地 "fire and forget"。对 web 服务的调用在完成之前不会阻塞客户端,而是立即 return。因此,使用 IsOneWay = true
的操作只能 return 无效。
IsOneWay = true
在回调合同上——这与在服务合同上的非常相似。当服务器调用回调合约上的操作时,它会立即return并且不会阻塞直到操作完成。
Void returns - 如果 IsOneWay 未设置为 true,调用仍将阻塞直到操作完成,SOAP 消息仍将 returned,但没有数据(除非你正在传回故障)。如果您希望实际 return 值,您可以像使用普通方法一样完全这样做,设置操作的 return 类型,即
[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>();
}
}
使用此方法:
- 调用 web 服务
GetDateTime()
操作会立即 return - "Very long operation" 将在服务器上执行
- 客户端上的
GetDateTimeCompleted(DateTime dateTime)
将在服务器完成时触发。
请注意,上面的双工示例并不完整,您需要确保正确处理会话等内容。
你绝对是在正确的轨道上。我建议遵循上面链接的教程(以及您找到的任何其他教程)并进行试验。您很快就会明白什么是可能的。