MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题

由于项目需要MongoDB做为存储数据库,在学习过程碰上疑难杂症,心痛如海,故此终于开始书写博客之路。

操作MongoDB类库版本:

----------------------------------------------

MongoDB.Driver 2.3 
MongoDB.Driver.Core 2.3
MongoDB.Bson 2.3

MongoDB 版本 3.2.9

参考相关学习链接(转载):---------------------------------------------
https://izk.cloud/437/  安全认证,权限管理
http://www.cnblogs.com/huangxincheng/archive/2015/10/12/4870557.html 主从热备集群

http://blog.csdn.net/luonanqin/article/details/8497860  集群搭建

连接字符串的相关变化:

-----------------------------------------------

没有安全认证的URL:mongodb://127.0.0.1:27017

加上安全认证的URL:mongodb://[userName]:[userPwd]@127.0.0.1:27017/[DataBaseName]

重点变化是最后一个指定数据库,如果不指定,将为默认数据库

所以想当然测试的时候一般使用的是mongodb://[userName]:[userPwd]@127.0.0.1:27017

并没有加上自定义数据库名称,导致初始化报错。

网上参考文章带安全验证的连接都是:mongodb://[userName]:[userPwd]@127.0.0.1:27017

都没有在最后补上/[DataBaseName]  导致自定义数据库的创建失败。

主副热备集群相关代码处理上的问题:

-------------------------------------------------

感谢国庆,感谢国家,感谢这二篇博文,一直在操作主副集群C#代码碰上未知报错,通过下面链接

深度学习了一下:

双十一来了,别让你的mongodb宕机了

MongoDB副本集学习(二):基本测试与应用

虽然依然没有解决我的问题,但是从中学习到经验,值得回报。

按照上面代码(转载):

MongoClientSettings set = new MongoClientSettings();
List<MongoServerAddress> servers = new List<MongoServerAddress>();
servers.Add(new MongoServerAddress("192.168.129.129", 37017));
servers.Add(new MongoServerAddress("192.168.129.129", 37018));
servers.Add(new MongoServerAddress("192.168.129.129", 37019));
set.Servers = servers;

//设置副本集名称
set.ReplicaSetName = "rs0";
//设置超时时间为3秒
set.ConnectTimeout = new TimeSpan(0, 0, 0, 3, 0);

MongoClient client = new MongoClient(set);
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("test");
MongoCollection coll = db.GetCollection("test");

//插入
BsonDocument bd = new BsonDocument();
bd.Add("name", "zhanjindong");
bd.Add("age", 23);
bd.Add("sex", "男D");

coll.Insert(bd);

//读取
QueryDocument qd = new QueryDocument();
qd.Add("name", "zhanjindong");
qd.Add("age", 23);
qd.Add("sex", "男D");

BsonDocument rd = coll.FindOneAs<BsonDocument>(qd);

Console.WriteLine(rd.ToString());

默认的C#驱动的ReadPreference是Primary,也就是说读写操作都是在主节点上的,那么当集群中只剩下一个节点的时候,按照前面所说该节点一定是secondary节点,这样读取操作也是没法进行的(通过mongo shell当然是可以的)。解决方法就是设置驱动的ReadPreferenceMode:

set.ReadPreference = new ReadPreference(ReadPreferenceMode.PrimaryPreferred);

状态说明:
primary
主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
primaryPreferred
首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
secondary
从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
secondaryPreferred
首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
nearest
最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点

你以为上面就复制粘贴一下就解决了?No,实际调用跟参考代码是二回事,呃?绕回正题,通过上面代码以为可以轻松一步了,结果又挖了一个大坑,在招待我。

报错详情:

System.TimeoutException”类型的异常在 MongoDB.Driver.Core.dll中发生,但未在用户代码中进行处理其他信息: A timeout occured after 3000ms selecting a server using CompositeServerSelector {
    Selectors = ReadPreferenceServerSelector {
        ReadPreference = {
            Mode = Secondary, TagSets = []
        }
    }, LatencyLimitingServerSelector {
        AllowedLatencyRange = 00: 00: 00.0150000
    }
}.Client view of cluster state is {
    ClusterId: "1",
    ConnectionMode: "ReplicaSet",
    Type: "ReplicaSet",
    State: "Disconnected",
    Servers: [{
        ServerId: "{ ClusterId : 1, EndPoint : "
        Unspecified / mongodb - 10.localdomain: 27017 " }",
        EndPoint: "Unspecified/mongodb-10.localdomain:27017",
        State: "Disconnected",
        Type: "Unknown",
        HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Sockets.SocketException: 不知道这样的主机。

我当时就#¥#@¥@#¥,你懂的,一波三折,要命,经过大量时间排查我锁定问题位置:

 EndPoint: "Unspecified/mongodb-10.localdomain:27017",

底气何来?原因如下:

如果你也是本地测试并且副集群IP地址使用是域名绑定,那么你在HOSTS没有配置域名的情况下,就会出现上面的超时30秒错误(一想起无数个F5等30秒就。。。。)

接下来配置HOSTS文件:

然后烧香拜佛,果然不出所料,调用成功,为此付出不少冤枉路,如果有人碰上相同的问题,可以参与一下。

最后放上测试单元代码:

using System;
using System.Collections.Generic;
using System.Linq;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System.Linq.Expressions;

public class MongoUnitily
{
    /// <summary>
    /// MongoDB调用类
    /// </summary>
    private MongoUnitily()
    {
        dataBase = new MongoClient(new MongoClientSettings
        {
            Credentials = new List<MongoCredential>() {
               MongoCredential.CreateCredential("avatar","*******","*********")  // 数据库名称,用户名,用户密码
            },
            Servers = new string[] { "10.199.*.1", "10.199.*.2", "10.199.*.3" }.Select(x => { return new MongoServerAddress(x); }), // 集群IP地址
            ConnectionMode = ConnectionMode.ReplicaSet,                                         // Replica 模式
            ReplicaSetName = "RS01",                                                       // Replica名称
            ReadPreference = new ReadPreference(ReadPreferenceMode.SecondaryPreferred),         // 读写配置,副IP不起作用的情况下使用主IP
            ConnectTimeout = new TimeSpan(0, 0, 0, 3, 0),                                       // 3秒报错测试,当初30秒我是等闲人。。。。
            MaxConnectionIdleTime = new TimeSpan(0, 0, 0, 3, 0),                                // 3秒报错测试,当初30秒我是等闲人。。。。
            MaxConnectionLifeTime = new TimeSpan(0, 0, 0, 3, 0),                                // 3秒报错测试,当初30秒我是等闲人。。。。
            ServerSelectionTimeout = new TimeSpan(0, 0, 0, 3, 0)                                // 3秒报错测试,当初30秒我是等闲人。。。。
        }).GetDatabase(database);                                                               // 通过数据库名称获取 DbBase
    }

    static MongoUnitily()
    {
        //初始化单例对象
        Instance = new MongoUnitily();

    }
    /// <summary>
    /// 数据库名称
    /// </summary>
    private string database = "avatar";//数据库名
      /// <summary>
      /// dataBase上下文对象
      /// </summary>
    private IMongoDatabase dataBase = null;

    public static MongoUnitily Instance { get; private set; }

    /// <summary>
    /// 验证读取
    /// </summary>
    /// <returns></returns>
    public bool IsGet()
    {
        bool result = true;
        var coll = dataBase.GetCollection<SysCodes>(nameof(SysCodes));
        Expression<Func<SysCodes, bool>> predicate = x => true;
        try
        {
            var count = coll.Find(predicate).Count();
        }
        catch
        {
            result = false;
        }
        return result;
    }

    /// <summary>
    /// 验证写
    /// </summary>
    /// <returns></returns>
    public bool IsPost()
    {
        var result = true;
        var coll = dataBase.GetCollection<Demo>(nameof(Demo));
        try
        {
            coll.InsertOne(new Demo { Id = Guid.NewGuid(), Name = "三" });
        }
        catch
        {
            result = false;
        }
        return result;
    }
    /// <summary>
    /// 测试类
    /// </summary>
    public class Demo
    {
        public Guid Id { get; set; }
        public string Name { get; set; }
    }
}
 

验证结果:

本篇文章旨在解决使用新版本MongoDB碰上的集群、连接字符串、安全验证的相关问题,文章深度不高,提供新手对象相互学习互挽。

时间: 2024-10-29 19:12:03

MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题的相关文章

MongoDB 3.0 关于安全认证后使用C#调用碰上“System.TimeoutException”类型的异常在 MongoDB.Driver.Core.dll 中发生的相关问题

"System.TimeoutException"类型的异常在 MongoDB.Driver.Core.dll 中发生,但未在用户代码中进行处理 操作MongoDB类库版本: ---------------------------------------------- MongoDB.Driver 2.3 MongoDB.Driver.Core 2.3 MongoDB.Bson 2.3 MongoDB 版本 3.0 连接字符串的相关变化: -----------------------

公司开到高新技术区可以只收11的企业所得税,拿到软件企业认证后可享受所得税两免三减半(从盈利年度算起)

作者:Xu Amy链接:https://www.zhihu.com/question/24468733/answer/27994181来源:知乎著作权归作者所有,转载请联系作者获得授权. 1. 明确公司的税收性质,一般纳税人?小规模纳税人? 软件销售及技术服务技术服务类的征收税率3%(小规模纳税人)6%(一般纳税人)软件产品17% 2. 技术开发费的增值税如何减免? 这一块是相对容易免税的,只需要将技术开发合同拿到当地的科技局备案即可,但必须注意:其中的知识产权必须是对方所有或者双方共享,如果是

微信服务号申请、认证、认证后

  微信公众号申请.认证:01. 账号申请开始------>02.申请账号结束----->7个工作日--->03.开始账号认证----->04.结束账号认证----->15个工作日--->05.账号认证通过 商家支付接口申请:     07.开始申请 商家微信支付接口----->08.结束申请 商家微信支付接口 ,等待审核---->7个工作日----->09.支付接口申请通过,进入技术集成阶段 -----------------------------

Shiro整合SSH开发3:配置Shiro认证后页面地址跳转问题(和详述不配置需要注意的问题)

在视频教程中讲请求认证成功后跳转页面的问题是一笔带过的,但是我觉得有必要单独写一篇对应的文章进行叙述. 我用了SSH来整合Shiro,在开发后验证的过程中,每次登陆后Shiro都会跳转到一个不知名js中,但是重点是我上一次访问的地址是: Edit http://localhost:8080/shiro_05/user/login.action 认证之后应该跳转到上一个请求的地址,但是Shiro却跳转到了: http://localhost:8080/shiro_05/user/js/eqmt.j

有线网端口开启802.1X认证后使用MDT部署服务

为了提高办公区网络安全,现要求所有的工位端口都需要开启802.1x认证,未通过认证或者认证超时的客户端会被分配至与办公网隔离的Guest VLAN中 对于已经安装操作系统的机器,只需要开启相关的服务即可,但是遇到需要使用MDT部署服务的时候,问题来了... 正常MDT部署流程: 插入网线-开机-选择网卡启动-从WDS服务器获取IP-从WDS服务获取启动映象-进入PE-选择部署序列-部署 开启1X认证后流程: 插入网线-开机-选择网卡启动-无法获取IP-退出PXE Boot 可以看到开启了1x认证

关于开启Eureka安全Security认证后,客户端死活注册不上的问题

遇到一个问题"开启Eureka服务端的安全认证后,客户端死活注册不到Eureka上",已经尝试了以下办法,完全搞不定... 客户端出错的版本: spring-boot:2.0.3.RELEASE spring-cloud:Finchley.RELEASE 查看客户端报的错误: cannot regist on known server retrying on another server if available  401错误 spring: profiles: peer1 secur

Spring Cloud ZooKeeper集成Feign的坑2,服务调用了一次后第二次调用就变成了500,错误:Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.n

错误如下: 2017-09-19 15:05:24.659 INFO 9986 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.spring[email protected]56528192: startup date [Tue Sep 19 15:05:24 CST 2017]; root of context hierarchy 2017-09-19 15:05:24.858 INFO 9986 --

Java基础(42):Java中主类中定义方法加static和不加static的区别(前者可以省略类名直接在祝方法调用,后者必须先实例化后用实例调用)

1 package lsg.ap.april4th2; 2 /* 3 知识点:1.Getter and Setter 的应用 4 2.局部变量与成员变量(也可叫做全局变量) 5 3.Static关键字的用法 6 a.成员变量被static修饰后的所有类的共享属性 7 b.方法被static修饰之后,在本类内调用的类名省略问题;以及不用Static,即使在本类内也必须先实例化 8 4.This关键字的用法 9 this:是当前类的对象引用.简单的记,它就代表当前类的一个对象. 10 11 注意:谁

TortoiseSVN升级后右键菜单没有TortoiseSVN的相关选项 解决方案

TortoiseSVN升级后右键菜单没有TortoiseSVN的相关选项 解决方案,布布扣,bubuko.com