zoukankan      html  css  js  c++  java
  • 跟着Artech学习WCF(4) MSMQ 绑定

    曾几何时 再看大家讨论各种构架时,经常出现在各个服务器间传递数据,经常出现MSMQ,

    那是看到这个心理就郁闷,怎么整天折腾ASP.NET 就没遇见过这个东西

    原来这个家伙藏在WCF里面

    嘿嘿这次被我发现了

    首先 第一次装IIS的话 默认是没有安装msmq 所以需要自己安装的

    看Artech 的介绍 这个东西在不能时刻保持和服务器连接的情况下 使用非常有用

    对于以WEB为构架为核心的 系统我虽然不知道这个东西有什么用

    但我觉得在移动应用中这个东西应该比较有用

    移动客户端和服务器端总是若离若弃

    但不知道 移动客户端支不支持 这个东西 例如 WINCE ,wp7 支不支持

    项目结构图如下

    新浪微博截图_未命名

    代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.Transactions;
    using cfContract;
    
    namespace cfClient
    {
        class Program
        {
            static void Main(string[] args)
            {
                ChannelFactory<IOrderProcessor> channelFactory = new ChannelFactory<IOrderProcessor>("defaultEndpoint");
                IOrderProcessor channel = channelFactory.CreateChannel();
    
                Order order = new Order(Guid.NewGuid(), DateTime.Today, Guid.NewGuid(), "A Company");
                order.OrderItems.Add(new OrderItem(Guid.NewGuid(), "PC", 5000, 20));
                order.OrderItems.Add(new OrderItem(Guid.NewGuid(), "Printer", 7000, 2));
    
                Console.WriteLine("Submit order to server");
                using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
                {
                    channel.Submit(order);
                    scope.Complete();
                }
                Console.Read();
            }
        }
    }

    ==================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    
    namespace cfContract
    {
        [ServiceContract]
        [ServiceKnownType(typeof(Order))]
       public interface IOrderProcessor
        {
    
            [OperationContract(IsOneWay = true)]
            void Submit(Order order);
    
        }
    }

    =================================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.Runtime.Serialization;
    namespace cfContract
    {
        [DataContract]
        [KnownType(typeof(OrderItem))]
       public class Order
        {
            #region Private Fields
            private Guid _orderNo;
            private DateTime _orderDate;
            private Guid _supplierID;
            private string _supplierName;
            private IList<OrderItem> _orderItems;
            #endregion
    
            #region Constructors
            public Order()
            {
                this._orderItems = new List<OrderItem>();
            }
    
            public Order(Guid orderNo, DateTime orderDate, Guid supplierID, string supplierName)
            {
                this._orderNo = orderNo;
                this._orderDate = orderDate;
                this._supplierID = supplierID;
                this._supplierName = supplierName;
    
                this._orderItems = new List<OrderItem>();
            }
    
            #endregion
    
            #region Public Properties
            [DataMember]
            public Guid OrderNo
            {
                get { return _orderNo; }
                set { _orderNo = value; }
            }
    
            [DataMember]
            public DateTime OrderDate
            {
                get { return _orderDate; }
                set { _orderDate = value; }
            }
    
            [DataMember]
            public Guid SupplierID
            {
                get { return _supplierID; }
                set { _supplierID = value; }
            }
    
            [DataMember]
            public string SupplierName
            {
                get { return _supplierName; }
                set { _supplierName = value; }
            }
    
            [DataMember]
            public IList<OrderItem> OrderItems
            {
                get { return _orderItems; }
                set { _orderItems = value; }
            }
    
            #endregion
    
    
            #region Public Methods
            public override string ToString()
            {
                string description = string.Format("General Informaion:\n\tOrder No.\t: {0}\n\tOrder Date\t: {1}\n\tSupplier No.\t: {2}\n\tSupplier Name\t: {3}", this._orderNo, this._orderDate.ToString("yyyy/MM/dd"), this._supplierID, this._supplierName);
                StringBuilder productList = new StringBuilder();
                productList.AppendLine("\nProducts:");
    
                int index = 0;
                foreach (OrderItem item in this._orderItems)
                {
                    productList.AppendLine(string.Format("\n{4}. \tNo.\t\t: {0}\n\tName\t\t: {1}\n\tPrice\t\t: {2}\n\tQuantity\t: {3}", item.ProductID, item.ProductName, item.UnitPrice, item.Quantity, ++index));
                }
    
                return description + productList.ToString();
            }
            #endregion
    
    
    
    
    
    
    
    
    
    
        }
    }

    ==================================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text;
    using System.Runtime.Serialization;

    namespace cfContract
    {
       public class OrderItem
        {

            #region Private Fields
            private Guid _productID;
            private string _productName;
            private decimal _unitPrice;
            private int _quantity;
            #endregion

            #region Constructors
            public OrderItem()
            { }

            public OrderItem(Guid productID, string productName, decimal unitPrice, int quantity)
            {
                this._productID = productID;
                this._productName = productName;
                this._unitPrice = unitPrice;
                this._quantity = quantity;
            }
            #endregion

           [DataMember]
            public Guid ProductID
            {
                get { return _productID; }
                set { _productID = value; }
            }

            [DataMember]
            public string ProductName
            {
                get { return _productName; }
                set { _productName = value; }
            }

            [DataMember]
            public decimal UnitPrice
            {
                get { return _unitPrice; }
                set { _unitPrice = value; }
            }

            [DataMember]
            public int Quantity
            {
                get { return _quantity; }
                set { _quantity = value; }
            }
      


        }
    }

    ===========================================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.Messaging;
    using cfService;
    
    namespace cfHosting
    {
        class Program
        {
            static void Main(string[] args)
            {
                string path = @".\private$\orders";
                //此计算机上尚未安装消息队列
    
    
                if (!MessageQueue.Exists(path))
                {
                    MessageQueue.Create(path, true);
                }
    
                using (ServiceHost host = new ServiceHost(typeof(OrderProcessorService)))
                {
                    host.Opened += delegate
                    {
                        Console.WriteLine("Service has begun to listen\n\n");
                    };
    
                    host.Open();
    
                    Console.Read();
    
    
    
                }
            }
        }
    }

    ==========================================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using cfContract;
    namespace cfService
    {
      public  class OrderProcessorService:IOrderProcessor
        {
          [OperationBehavior(TransactionScopeRequired=true,TransactionAutoComplete=true)]
            void IOrderProcessor.Submit(Order order)
            {
    
                Orders.Add(order);
                Console.WriteLine("Receive an order.");
                Console.WriteLine(order.ToString());
    
            }
        }
    }

    ===========================================================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using cfContract;
    
    namespace cfService
    {
     public static   class Orders
        {
            private static IDictionary<Guid, Order> _orderList = new Dictionary<Guid, Order>();
    
            public static void Add(Order order)
            {
                _orderList.Add(order.OrderNo, order);
            }
    
            public static Order GetOrder(Guid orderNo)
            {
                return _orderList[orderNo];
            }
        }
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    服务器端配置

    <system.serviceModel>
      <bindings>
        <netMsmqBinding>
          <binding name="msmqBinding">
            <security>
              <transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
              <message clientCredentialType="None" />
            </security>
          </binding>
        </netMsmqBinding>
      </bindings>
      <services>
        <service name="cfService.OrderProcessorService">
          <endpoint address="" binding="netMsmqBinding"
              bindingConfiguration="msmqBinding" contract="cfContract.IOrderProcessor" />
          <host>
            <baseAddresses>
              <add baseAddress="net.msmq://localhost/private/orders"/>
            </baseAddresses>
          </host>
        </service>
      </services>
    </system.serviceModel>

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    客户端配置

    <system.serviceModel>
      <bindings>
        <netMsmqBinding>
          <binding name="msmqBinding">
            <security>
              <transport msmqAuthenticationMode="None" msmqProtectionLevel="None" />
              <message clientCredentialType="None" />
            </security>
          </binding>
        </netMsmqBinding>
      </bindings>
      <client>
        <endpoint address="net.msmq://localhost/private/orders" binding="netMsmqBinding"
            bindingConfiguration="msmqBinding" contract="cfContract.IOrderProcessor"
            name="defaultEndpoint" />
      </client>
    </system.serviceModel>

  • 相关阅读:
    转:mac下安装homebrew
    jdk1.7下载路径
    转: Mac 使用ADT的问题
    转:mac下安装Sublime Text
    转: SVN和Git的一些用法总结
    转: SVN使用教程总结(图文丰富,相当详细)
    转:Tortoise SVN 版本控制常用操作知识
    Android Java混淆(ProGuard)
    转:美团Android资源混淆保护实践
    【IPC进程间通讯之三】内存映射文件Mapping File
  • 原文地址:https://www.cnblogs.com/qqloving/p/2173378.html
Copyright © 2011-2022 走看看