WCF技术内幕 第3章 (2)

请求/应答消息交换模式


请求/应答和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>消息头定义的地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值