请求/应答消息交换模式
请求/应答和WSDL
代码里的wsdl:input和wsdl:output元素的顺序暗示了在一个应答消息发送以前,请求消息必须先被接收。
请求/应答和WCF契约
WCF操作契约默认使用请求/应答消息交换模式。任何WCF认为可序列化的类型都可以指定为一个返回类型。
//契约
using System.ServiceModel;
namespace WcfServiceApp3
{
[ServiceContract(Name="IActionsService", Namespace="http://www.andersoft.com/IActionsService")]
public interface IActionsService
{
[OperationContract(
Action="urn:Sum",
Name="Sum",
ReplyAction="urn:SomeActionOutput")]
int Sum(int value1, int value2);
}
}
//Service实例
using System;
namespace WcfServiceApp3
{
public class ActionsService : IActionsService
{
public int Sum(int value1, int value2)
{
Console.WriteLine("Computing Now...");
return value1 + value2;
}
}
}
//Host
using System;
using System.ServiceModel;
using System.Text;
using WcfServiceApp3;
namespace HostApp
{
class Program
{
static void Main(string[] args)
{
WSHttpBinding binding = new WSHttpBinding();
binding.MessageEncoding = WSMessageEncoding.Text;
binding.TextEncoding = Encoding.UTF8;
ServiceHost svc = new ServiceHost(typeof(ActionsService));
svc.AddServiceEndpoint(typeof(IActionsService), binding, new Uri("http://localhost:9876/IActionsService"));
Console.WriteLine("Start the service...");
svc.Open();
Console.WriteLine("Service started...");
Console.ReadKey();
}
}
}
//Requester
using System;
using System.ServiceModel;
using System.Text;
using WcfServiceApp3;
namespace RequesterApp
{
class Program
{
static void Main(string[] args)
{
WSHttpBinding binding = new WSHttpBinding();
binding.TextEncoding = Encoding.UTF8;
binding.MessageEncoding = WSMessageEncoding.Text;
EndpointAddress address=new EndpointAddress("http://localhost:9876/IActionsService");
ChannelFactory<IActionsService> channelFactory = new ChannelFactory<IActionsService>(binding, address);
IActionsService service = channelFactory.CreateChannel();
Console.WriteLine("Begin send request...");
int res = service.Sum(100, 200);
Console.WriteLine("Got the response...");
Console.WriteLine("Print the result:{0}", res);
Console.ReadKey();
}
}
}
传输考虑
当WCF最初发布的时候,还没有对于使用MSMQ的请求/应答消息交换模式的直接支持,同样也不支持UDP。
当使用像TCP,HTTP或命名管道这样的传输时,接收者可以通过反向通道发送应答消息。在这些场景里,WS-addressing表示应答消息应该发送到<ReplyTo>消息头定义的地址。