本文介绍如何使用C# SDK中的sample代码,来完成创建主题、创建订阅、启动HttpEndpoint、发布消息、查看HttpEndpoint接收消息和删除主题操作。

步骤一:准备工作

  1. 下载最新版C# SDK,解压后将工程导入到VisualStudio。
  2. 工程里有4个项目,其中一个是AliyunSDK_MNS,这就是SDK所在的项目。右击项目名,选择重新生成,可以在项目的bin目录下找到生成的Aliyun.MNS.dll。
    说明 其他几个项目里都需要引用这个生成的dll,请配置好其他几个项目的引用。
  3. 在项目AliyunSDK_MNS_Sample里有主题操作的Sample:SyncTopicOperations.cs。
    1. 将AliyunSDK_MNS_Sample这个项目设置为启动项,并将SyncTopicOperations.cs设置为启动对象。
    2. 打开SyncTopicOperations.cs文件,在文件的最上几行,配置AccessKeyId、AccessKeySecret和Endpoint。
      • AccessKeyId、AccessKeySecret
      • Endpoint
        • 访问MNS的接入地址,请登录MNS控制台,单击右上角获取Endpoint获取Endpoint查看。
        • 不同地域的接入地址不同。

步骤二:创建主题

如果之前未创建过主题,那么首先需要创建主题。默认创建的主题名称是TestCSharpTopic,也可以修改代码指定主题名称。

// 1. 生成一个CreateTopicRequest实例,参数传入topicName。这里可以同时传入TopicAttributes,以便在CreateTopic时同时设置自定义的Topic属性。
var createTopicRequest = new CreateTopicRequest
{
    TopicName = _topicName
};

Topic topic = null;
try
{
    topic = client.CreateTopic(createTopicRequest);
    Console.WriteLine("Create topic successfully, topic name: {0}", topic.TopicName);
}
catch (MNSException me)
{
    // 2. 可能因为网络错误,或者Topic已经存在等原因导致CreateTopic失败,这里CatchException并做对应的处理
    // 2.1 也可以分别Catch TopicAlreadyExistException等做单独处理
    Console.WriteLine("CreateTopic Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Create topic failed, exception info: " + ex.Message);
    return;
}          

步骤三:启动HttpEndpoint

  • 项目MNS_CSharp_SDK_Test下有一个SampleHttpServer.cs,将它设为启动项目并运行。这个SampleHttpServer依赖于.net framework 4.5。
  • 请确认本机有公网IP地址,否则MNS Server无法把消息通过HttpEndpoint推送到您的机器。
  • 功能
    • 对MNS推送消息请求做签名验证。
    • 解析推送请求的body。
    • 返回StatusCode: 200。
  • 由于SampleHttpServer的代码较多,请直接查看SDK中的源码。

步骤四:创建订阅

创建订阅以告诉MNS Server,主题里面的消息应该推送到哪里。Sample里使用的是HTTP的Endpoint。

try
{
    // 1. 生成SubscriptionAttributes,这里第二个参数是Subscription的Endpoint。请将"XXXX"改成实际的IP和Port
    // 1.1 这里设置的是刚才启动的http server的地址
    // 1.2 更多支持的Endpoint类型可以参考:help.aliyun.com/document_detail/27479.html
    SubscribeResponse res = topic.Subscribe(_subscriptionName, "http://XXXX");
    // 2. 订阅成功
    Console.WriteLine("Subscribe succeed");
}
catch (MNSException me)
{
    // 3. 可能因为网络错误,或者同名的Subscription已存在等原因导致订阅出错,这里CatchException并做对应的处理
    Console.WriteLine("Subscribe Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("Subscribe failed, exception info: " + ex.Message);
}            

步骤五:发布消息

现在可以发布消息到主题中,并且期待在HttpServer上收到对应的消息。

try
{
    // 1.1 如果是推送到邮箱,还需要生成PublishMessageRequest并设置MessageAttributes
    var response = topic.PublishMessage("message here </asdas\">");
    Console.WriteLine("PublishMessage succeed! " + response.MessageId);
}
catch (MNSException me)
{
    // 3. 可能因为网络错误等原因导致PublishMessage失败,这里CatchException并做对应处理
    Console.WriteLine("PublishMessage Failed! ErrorCode: " + me.ErrorCode);
}
catch (Exception ex)
{
    Console.WriteLine("PublishMessage failed, exception info: " + ex.Message);
}           

步骤六:查看HttpEndpoint接收消息

步骤五中发布了一条消息到主题,MNS会将发布的消息推送给步骤三启动的HttpEndpoint。HttpEndpoint在接收到消息推送请求后,会打印到Console。

步骤七:取消订阅

现在不需要再接收消息,可以告诉MNS Server取消订阅。

try
{
    topic.Unsubscribe(_subscriptionName);
    Console.WriteLine("Unsubscribe succeed!");
}
catch (Exception ex)
{
    Console.WriteLine("Subscribe failed, exception info: " + ex.Message);
}           

步骤八:删除主题

Sample中,最后删除了这个测试用的主题。

try
{
    client.DeleteTopic(_topicName);
    Console.WriteLine("Delete topic succeed");
}
catch (Exception ex)
{
    Console.WriteLine("Delete topic failed, exception info: " + ex.Message);
}