This topic describes how to use the SDK for C# to create a queue, send a message, receive and delete the message, and delete the queue.

Step 1: Prepare the environment

  1. Download the latest version of the SDK for C#, decompress the package, and then add the folder to Visual Studio as a solution.
  2. The solution contains four projects. Right-click the AliyunSDK_MNS project and select Rebuild. The Aliyun.MNS.dll file is generated in the bin directory of the project.
    Note Specify the Aliyun.MNS.dll file as the reference of other projects.
  3. To view sample code that you can use to manage queues, open the SyncTopicSample.cs file in the AliyunSDK_MNS_Sample project.
    1. Set AliyunSDK_MNS_Sample as the startup project and SyncTopicSample as the startup object.
    2. Open the SyncTopicSample.cs file and specify the AccessKey ID, AccessKey secret, and endpoint at the beginning of the file.
      • AccessKey ID and AccessKey secret
        • The AccessKey pair that is used to call API operations in Alibaba Cloud.
        • If you are using an Alibaba Cloud account, go to the AccessKey Management page of the Alibaba Cloud Management Console to create and view your AccessKey pair.
        • If you are a RAM user, log on to RAM console to view your AccessKey pair.
      • Endpoint
        • The endpoint that is used to access MNS. To view the endpoints, log on to the MNS console, and click Get Endpoint in the upper-right corner.
        • The endpoint of MNS varies based on different regions.

Step 2: Create a queue

If no queue is available, you must create a queue. The default name of the new queue is myqueue. You can also specify another queue name.

// 1. You can specify the parameters of the queue based on your needs. For more information about the parameters of a queue, see Queue.
var createQueueRequest = new CreateQueueRequest
{
    QueueName = _queueName,
    Attributes =
    {
        // You must specify the VisibilityTimeout parameter. Default value: 30.
        VisibilityTimeout = 30,
        MaximumMessageSize = 40960,
        MessageRetentionPeriod = 345600,
        // The PollingWaitSeconds parameter specifies the timeout period of a long polling request.
        PollingWaitSeconds = 30
    }
};

try
{
    // 2. Create a queue. If you do not need to specify the parameters of a queue, you can use the client.CreateQueue(_ queueName) method to create a queue.
    var queue = client.CreateQueue(createQueueRequest);
    Console.WriteLine("Create queue successfully, queue name: {0}", queue.QueueName);
}
catch (MNSException me)
{
    // 3. The queue may fail to be created if a network error occurs or the queue name already exists. You can call the CatchException operation to identify and resolve the failure.
    Console.WriteLine("CreateQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Create queue failed, exception info: " + ex.Message);
}           

Step 3: Send a message

After the queue is created, you can send messages to the queue.

try
{
    // 1. Retrieve a queue.
    var nativeQueue = client.GetNativeQueue(_queueName);
    // 2. Generate a request to send a message. You can specify the parameters of the message based on your needs.
    var sendMessageRequest = new SendMessageRequest("Alibaba<MessageBody>Cloud");
    // 3. Send a message. If you do not need to specify the parameters of a message, you can use the nativeQueue.SendMessage ("MessageBody") method.
    var sendMessageResponse = nativeQueue.SendMessage(sendMessageRequest);
    Console.WriteLine("Send message succeed“);
}
catch (MNSException me)
{
    // 4. The queue may fail to be created if a network error occurs or the queue name already exists. You can call the CatchException operation to identify and resolve the failure.
    Console.WriteLine("SendMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Send message failed, exception info: " + ex.Message);
}            

Step 4: Receive and delete the message

If the message exists in a queue, you can receive the message.

You must specify the NextVisibleTime parameter in MNS. For more information, see QueueMessage.

try
{
    // 1. Call the receiveMessage() function.
    // We recommend that you set the WaitSeconds parameter to 30 when you call the receiveMessage() function.
    // If you set the WaitSeconds parameter to a non-zero value, a request of receiving messages is an HTTP long polling request. The long-polling request holds until a message is available in the queue. The maximum value of the WaitSeconds parameter is 30.
    var receiveMessageResponse = nativeQueue.ReceiveMessage(30);
    // 2. Retrieve the value of the ReceiptHandle parameter. The receipt handle of a message has a validity period and can be used to modify or delete the message. For more information, see QueueMessage.
    _receiptHandle = message.ReceiptHandle;
}
catch (MNSException me)
{
    // 3. A message may fail to be received if an error occurs. You can call the CatchException operation to identify and resolve the failure.
    Console.WriteLine("ReceiveMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("ReceiveMessage failed, exception info: " + ex.Message);
}

// Specify your own logic for processing messages based on your needs.
// The VisibilityTimeout parameter specifies the period when a message remains in the Inactive state in the queue after the message has been consumed by a client. After the specified period, the message changes to the Active state again and can be consumed by other clients. This prevents message loss against unexpected exits.

// 4. After a message is consumed, you can delete the message from the queue.
try
{
    // 5. Call the deleteMessage() function.
    var deleteMessageResponse = nativeQueue.DeleteMessage(_receiptHandle);
}
catch (MNSException me)
{
    // 6. If an error occurs, you can call the CatchException operation to identify and resolve the failure.
    // If a receipt handle expires, the MessageNotExist error is returned. This error code indicates that you cannot use the receipt handle to find the corresponding message.
    // To ensure that you can manage a message before the current receipt handle expires, you must set the VisibilityTimeout parameter to an appropriate value. You can call the changeMessageVisibility() function to modify the value of the VisibilityTimeout parameter.
    Console.WriteLine("DeleteMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Delete message failed, exception info: " + ex.Message);
}            

Step 5: Delete the queue

You can use the following sample code to delete the queue.

try 
{
    var deleteQueueResponse = client.DeleteQueue(deleteQueueRequest);
} 
catch (MNSException me)
{
    Console.WriteLine("DeleteQueue Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Delete queue failed, exception info: " + ex.Message);
}