msmq

Contract:
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;

namespace Contract
{
    [ServiceContract(ConfigurationName = "IGreetingService")]
    public interface IGreetingService
    {
        [OperationContract(IsOneWay = true)]
        void SaveHello(string msg);
        [OperationContract(IsOneWay = true)]
        void SaveGoodBye(string msg);

    }

    [ServiceContract(ConfigurationName = "IGreetingService1",SessionMode =SessionMode.Required)]
    public interface IGreetingService1
    {
        [OperationContract(IsOneWay = true)]
        void SaveHello(string msg);
        [OperationContract(IsOneWay = true)]
        void SaveGoodBye(string msg);

    }
}
service
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <system.serviceModel>
    <bindings>
      <netMsmqBinding>
        <binding name="netmsmqbind1" exactlyOnce="true" useActiveDirectory="true" durable="true"  >
          <security mode="None" >
            
          </security>
        </binding>
      </netMsmqBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="batchingMessages">
          <transactedBatching maxBatchSize="22"/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service name="GreetingService">
        <endpoint address="net.msmq://localhost/private/queue4demo"  binding="netMsmqBinding" bindingConfiguration="netmsmqbind1" behaviorConfiguration="batchingMessages"
        contract="IGreetingService" />
      </service>
      <service name="GreetingService1">
        <endpoint address="net.msmq://localhost/private/queue4demo"  binding="netMsmqBinding" bindingConfiguration="netmsmqbind1" 
        contract="IGreetingService1" />
      </service>
    </services>
  </system.serviceModel>
</configuration>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using System.Messaging;
using Contract;
using System.Data.Common;
using System.Transactions;
namespace ConsoleApplication1
{

    /// <summary>
    /// //behaviorConfiguration="batchingMessages" 应用了batchingMessages(事务处理批处理要求),下面的ReleaseServiceInstanceOnTransactionComplete要设置为false,默认为true
    /// </summary>
    [ServiceBehavior(ConfigurationName = "GreetingService",ReleaseServiceInstanceOnTransactionComplete =false)]
    public class GreetingService : IGreetingService
    {
        [OperationBehavior(TransactionScopeRequired =true)]
        public void SaveHello(string msg)
        {
            Console.WriteLine(msg+" "+Transaction.Current.TransactionInformation.DistributedIdentifier);
        }

        [OperationBehavior(TransactionScopeRequired = true)]
        public void SaveGoodBye(string msg)
        {
            Console.WriteLine(msg +" "+ Transaction.Current.TransactionInformation.DistributedIdentifier);
        }
    }

    [ServiceBehavior(ConfigurationName = "GreetingService1", TransactionAutoCompleteOnSessionClose = true)]
    public class GreetingService1 : IGreetingService1
    {
        [OperationBehavior(TransactionScopeRequired = true,TransactionAutoComplete =false)]
        public void SaveHello(string msg)
        {
            Console.WriteLine(msg + " " + Transaction.Current.TransactionInformation.DistributedIdentifier);
        }

        [OperationBehavior(TransactionScopeRequired = true,TransactionAutoComplete =false)]
        public void SaveGoodBye(string msg)
        {
            Console.WriteLine(msg + " " + Transaction.Current.TransactionInformation.DistributedIdentifier);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            #region 1
            //string queueName = @".private$queue4demo";
            //MessageQueue.Delete(queueName);
            //if (!MessageQueue.Exists(queueName))
            //    MessageQueue.Create(queueName, true);//第二参数代表是否是事务性队列,如果是那么binding.ExactlyOnce要设置为true,否则非事务性对要设置为false
            //using (ServiceHost host = new ServiceHost(typeof(GreetingService)))
            //{
            //    var binding = new NetMsmqBinding(NetMsmqSecurityMode.Message);
            //    binding.ExactlyOnce = true;
            //    //host.AddServiceEndpoint("IGreetingService",binding , "net.msmq://localhost/private/queue4demo");
            //    host.Open();
            //    Console.WriteLine("寄宿服务成功");
            //    Console.ReadKey();
            //} 
            #endregion

            #region 2
            string queueName = @".private$queue4demo";
            MessageQueue.Delete(queueName);
            if (!MessageQueue.Exists(queueName))
                MessageQueue.Create(queueName, true);//第二参数代表是否是事务性队列,如果是那么binding.ExactlyOnce要设置为true,否则非事务性对要设置为false
            using (ServiceHost host = new ServiceHost(typeof(GreetingService1)))
            {
                var binding = new NetMsmqBinding(NetMsmqSecurityMode.Message);
                binding.ExactlyOnce = true;
                //host.AddServiceEndpoint("IGreetingService",binding , "net.msmq://localhost/private/queue4demo");
                host.Open();
                Console.WriteLine("寄宿服务成功1");
                Console.ReadKey();
            }
            #endregion
            Console.WriteLine("");
           
        }
    }
}
client
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <system.serviceModel>
    <bindings>
      <netMsmqBinding>
        <binding name="bindWithNoneSecurityMode">
          <security mode="None">            
          </security>
        </binding>
      </netMsmqBinding>
    </bindings>
    <client>
      <endpoint name="GreetingService" address="net.msmq://localhost/private/queue4demo"  binding="netMsmqBinding" bindingConfiguration="bindWithNoneSecurityMode" contract="IGreetingService">
        
      </endpoint>
      <endpoint name="GreetingService1" address="net.msmq://localhost/private/queue4demo"  binding="netMsmqBinding" bindingConfiguration="bindWithNoneSecurityMode" contract="IGreetingService1">

      </endpoint>
    </client>
  </system.serviceModel>
</configuration>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;
using Contract;
using System.Transactions;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 1
            //using (ChannelFactory<IGreetingService> ChannelFactory = new ChannelFactory<IGreetingService>("GreetingService"))
            //{
            //    IGreetingService proxy = ChannelFactory.CreateChannel();
            //    proxy.SaveHello("foo");
            //    proxy = ChannelFactory.CreateChannel();
            //    proxy.SaveGoodBye("bar");
            //    proxy = ChannelFactory.CreateChannel();
            //    proxy.SaveHello("foo");
            //    proxy = ChannelFactory.CreateChannel();
            //    proxy.SaveGoodBye("bar");
            //    Console.Read();
            //}
            #endregion

            #region 2
            using (ChannelFactory<IGreetingService1> ChannelFactory = new ChannelFactory<IGreetingService1>("GreetingService1"))
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    IGreetingService1 proxy = ChannelFactory.CreateChannel();
                    proxy.SaveHello("hello1");
                    proxy.SaveGoodBye("goodbye1");
                    ((ICommunicationObject)proxy).Close();
                    scope.Complete();
                }
            }
            #endregion
        }
    }
}
原文地址:https://www.cnblogs.com/kexb/p/8545996.html