【问题标题】:Messages not being added to my MSMQ未将消息添加到我的 MSMQ
【发布时间】:2014-08-30 12:25:39
【问题描述】:

我正在尝试第一次运行 MSMQ 服务。

我从 MSDN 复制了一个示例,我正在尝试让它工作。

一切正常,没有错误。然而,当我去检查我的 MSMQ 时,没有可用/添加的消息。

我使用了Trace工具SvcTraceViewe.exe,没有报错。

这是我在类 DLL 中定义的服务:

public class MotionSaver : IMotionSaver
{
    [OperationBehavior]
    public void MotionFrame(byte[] data)
    {
        // DO I NEED TO PUT ANTHING IN HERE??
    }
}

[ServiceContract]
public interface IMotionSaver
{
    //IsOneWay=true denotes that there will no return message from the server to the client.
    [OperationContract(IsOneWay = true)]
    void MotionFrame(byte[] data);
}

这是调用上述 DLL 的我的服务器主机:

static void Main(string[] args)
{
    try
    {
        using (ServiceHost host = new ServiceHost(typeof(MotionSaver)))
        {
            //Path of the Queue. Here we are creating a private queue with the name VishalQ 
            //where all our message would be stored, if server is unavialable.
            string queueName = ConfigurationManager.AppSettings["queueName"];
            //Checking whether the queue exists or not.
            if (!MessageQueue.Exists(queueName))
            {
                //If the queue doesnot exists it will create a queue with the name VishalQ
                //the second parameter false denotes that the queue would be a non transaction queue. If you want that your queue to be 
                //transaction then make the second parameter to true.
                MessageQueue.Create(queueName, true);
            }
            //finally opening the host to server the clients.
            host.Open();
            Console.WriteLine("Server is up and running on port 32578");
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }
    catch  (Exception ex)
    {
        Console.WriteLine(ex.ToString());
        Console.ReadKey();
    }
}

这是我在宿主应用程序中的 app.config 设置:

<configuration>
  <appSettings>
    <add key="queueName" value=".\private$\MotionSaverTest4" />
  </appSettings>

  <system.diagnostics>
    <trace autoflush="true" />
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="sdt"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "SdrConfigExample.e2e" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>


  <system.serviceModel>
    <diagnostics performanceCounters="All"/>
    <services>
      <service name="InformedMotion.Motion.MotionSaver" behaviorConfiguration="myBehavior">
        <!--Address attribute specifies the name of the MSMQ Queue.-->
        <endpoint name="motionQ" address="net.msmq://localhost/private/MotionSaverTest4" binding="netMsmqBinding" 
                  bindingConfiguration="myMSMQ"                
                  contract="InformedMotion.Motion.IMotionSaver">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="net.msmq://localhost/private/"/>
            <!--Both Mex and HttpBinding uses http://localhost:8888 port-->
            <add baseAddress="http://localhost:32578"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <!--The property exactlyOnce=false means that i am using non transactional queue. The property is by default true.-->
      <netMsmqBinding>
        <binding name="myMSMQ" exactlyOnce="true">
        <!--<binding name="myMSMQ" exactlyOnce="false" durable="false">-->
          <!--
                        If we donot set the security mode to none then the following error occurs.
                        Binding validation failed because the binding's MsmqAuthenticationMode property is set to 
                        WindowsDomain but MSMQ is installed with Active Directory integration disabled. 
                        The channel factory or service host cannot be opened.
                    -->
          <security mode="None"/>
        </binding>
      </netMsmqBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="myBehavior">
          <serviceMetadata httpGetEnabled="true"/>
          <!--This is for enabling an exception-->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/></startup></configuration>

这是调用服务的客户端应用:

static void Main(string[] args)
{
    wsMotionQ.MotionSaverClient ws = new MotionSaverClient();
    ws.MotionFrame(new byte[] { 1 });

    Console.WriteLine("All Wishes sent successfully");
    Console.ReadLine();
}

这是我的客户端 app.config:

<configuration>
    <system.serviceModel>
        <bindings>
            <netMsmqBinding>
                <binding name="motionQ">
                    <security mode="None" />
                </binding>
            </netMsmqBinding>
        </bindings>
        <client>
            <endpoint address="net.msmq://localhost/private/MotionSaverTest4"
                binding="netMsmqBinding" bindingConfiguration="motionQ" contract="wsMotionQ.IMotionSaver"
                name="motionQ">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>
  </startup>
</configuration>

我已检查我的消息队列已创建。

1)。消息如何添加到队列中?我的服务中的空方法有什么意义? 2)。为什么我的消息没有被添加?

谢谢

注意

将代码更改为:

[OperationBehavior]
public void MotionFrame(byte[] jpegData)
{
    using (Message msg = new Message())
    {
        msg.BodyStream = new MemoryStream(jpegData);
        msgQMissedData.Send(msg);
    }
}

【问题讨论】:

    标签: c# wcf msmq netmsmqbinding


    【解决方案1】:

    您只是在创建队列,而不是向/从它发送/接收消息。

    http://www.codeproject.com/Articles/5830/Using-MSMQ-from-C

    【讨论】:

    • 嗨,我按照这个例子:c-sharpcorner.com/UploadFile/17e8f6/msmq-in-wcf。该函数中也没有代码。我期望有代码是迂腐的还是我应该使用常识,我需要添加代码lol?
    • 嗨,我当然需要在我的服务中添加代码才能添加代码(LOL)。我终于通过手动而不是通过代码创建 MSMQ 来让它工作 - 这使它工作......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 2014-02-23
    • 1970-01-01
    • 2012-04-12
    • 2011-09-22
    相关资源
    最近更新 更多