“Authentication to host ‘localhost’ for user ‘root’ using method ‘mysql_native_password’ failed with message: Reading from the stream has failed” 昨天晚上,因为某些原因,几天没打开的C#.net winform项目调试时突然启动失败,冒出来这个提示。 说实话,因为没抓着重点,我昨晚基本上就浪费了,虽然我猜到了是连接超时之类的原因,可一直没明白究竟是我弄错了什么,才会连接不上MySQL数据库 今天再找原因的时候,就Get到重点了:“Reading from the stream has failed”,这个是数据库返回的报错信息 搜索了一下,看到一个文章,说是从MySQL5.7以后,就增加了SSL连接验证功能,这个功能就可能导致上面这个报错,关掉它的话,连接速度能变快 尽管根据了解到的资料,SSL这个校验应该不会影响到使用 Localhost(本地)方式连接的才对,但还是死马当活马医,在ado.net连接字符串里加上了“SslMode=None;” 结果是成功的,确实不再报错,连接上了 再回过头来想想,我这两天也没对MySQL做过什么设置更改啊,仅有的操作,就是配置了一下ODBC数据源,怎么会突然间就出现这毛病呢? 不知道有没有大佬了解的,求科普 ———————————————— 版权声明:本文为CSDN博主「某店长」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/jdjdjdjdjdjd/article/details/89068331
View Details<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/> <add name="Access-Control-Allow-Headers" value="x-requested-with"/> <add name="Access-Control-Allow-Origin" value="*" /> </customHeaders> </httpProtocol> </system.webServer> from:https://www.cnblogs.com/soonqian/p/6548118.html
View Details|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<configuration> <system.webServer> <modules> <add name="CultureAwareHttpModule" type="Web_SJWD.Lang.CultureAwareHttpModule" /> </modules> <validation validateIntegratedModeConfiguration="false" /> <!---加下面这段可以跨域---> <httpProtocol> <customHeaders> <remove name="X-Powered-By" /> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Headers" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" /> </customHeaders> </httpProtocol> </system.webServer> </configuration> |
from:https://www.cnblogs.com/q149072205/p/11089954.html
View Details转自:https://blog.csdn.net/kongwei521/article/details/54927689 在项目开发过程中,估计也有人和我遇到过同样的经历:运行环境出现了重大Bug亟需解决、或者由于电脑挂了、旧代码覆盖新代码,而在这种情况下,我们不能直接在当前的代码中修改这个Bug然后发布,这会导致更严重的问题,因为相当于版本回退了。还有电脑挂了代码整个都没有,这种情况下 我们只能只能利用一些逆向的技巧和工具了 来解析在服务器发布好的dll。那么你只是单纯的修改一个.Net程序集中的某个方法或功能,而且这个程序集还是出自于你自己或你所在团队之手,这实在是一件非常容易的事情,这和破解别人的程序完全不同,你不会遇到无法破解的加密算法,也不会遇到让人恶心的加壳混淆。所以我要把用过的工具一个个的列出来总结一下。 推荐四大发编译工具 1:.Net Reflector 【收费】 一提起.Net逆向,其实很多人第一反应都是Reflector这款神器,这一方面是由于Reflector良好的用户体验和强大的插件功能,另一方面要归功于Reflector堪称完美的智能反编译能力,使用它不仅能看到反编译后的IL源码甚至能直接反编译出C#源码,而且和编写时的代码几无二致,如果需要还可以直接另存为工程文件用Visual Studio打开,不过现在已经收费了,所以老司机都选择破解版,有钱人选择正版。 破解地址就不在这里放出,大家自行搜索. 使用方法:可以直接把dll、exe拖放到左侧,或者文件选择选择 官方网址:http://www.red-gate.com/products/dotnet-development/reflector/ 2:ILSpy/dnSpy 【免费】 ILSpy是唯一免费且开源的.NET反编译器,它基于MIT许可证发布。ILSpy的代码生成和语法高亮功能做的非常好。对于反编译的程序集,它既可以将其保存在一个文件中,也可以为所有文件创建一个项目。ILSpy是一个独立的工具,没有Visual Studio集成。,ILSpy 是为了完全替代收费的Reflector而生,它是由 iCSharpCode 团队出品,这个团队开发了著名的 SharpDevelop 。ILSpy 完全开源,ILSpy的使用和上面的Reflector完全类似,可以直接把dll、exe拖放到左侧,或者文件选择选择。 官方网址:http://ilspy.net/ ILSPY还有一款同门师弟,感觉比ILSPY还强大 dnSpy is a .NET assembly editor, decompiler, and debugger forked from ILSpy * Assembly editor * Decompiler * Debugger * Tabs and tab groups * Themes (blue, dark, light and high contrast) If you want to help, fork the project and send pull requests. Latest release: https://github.com/0xd4d/dnSpy/releases Latest build: https://ci.appveyor.com/project/0xd4d/dnspy/build/artifacts 3:JetBrains dotPeek【免费】 JetBrains是捷克的一家软件开发公司,出品了大量著名的开发工具,包括:IntelliJ IDEA、PHPStorm、ReSharper、TeamCity、YouTrack等等,每一款产品都如雷贯耳。dotPeek 是 JetBrains 开发的一款.Net反编译工具,是.Net工具套件中的一个相比于前面几款工具来说,dotPeek算比较小众的一款,它生成的代码质量很高,它还会尝试到源代码服务器上抓取代码。DotPeek的导航功能和快捷键非常便捷。它还能精确查找符号的使用,同时支持插件。DotPeek不能与Visual Studio集成。个人感觉它最大的特色就是Visual Studio风格,这对于那些长期在Visual Studio下进行开发的人来说应该更亲切一点。 官方网址:http://www.jetbrains.com/decompiler/ 4:Telerik JustDecompile 【需要输入信息安装】不喜欢这个就卸载了 Telerik JustDecompile是一个免费的.NET反编译器,但是有商业化支持。它生成的代码质量也很高。它可以为反编译程序集得到的代码创建一个项目。JustDecompile提供了健壮的查找功能,能够支持全文查找和符号使用查找。它还有一个插件系统,目前在Telerik的网站上有两个可用的扩展。JustDecompile不能与Visual Studio集成。 […]
View Details|
1 |
wsdl /language:c# /n:JSRMYY /out:c:/WebServiceForAutoOrder.cs http://{url}/hisOrderReal/WebServiceForAutoOrder.asmx?WSDL |
公司一老哥提供的方法,避免生成一大堆文件~ wsdl.exe下载
View DetailsIIS部署的网站打开出现问题: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\6ba3b83b\52fcdeee\App_global.asax.7ky3gsdp.dll”--“拒绝访问。 ” 将windows/temp属性-安全-高级 添加IIS_USERS用户,同时编辑权限为完全控制(写入和编辑)保存即可 from:https://www.cnblogs.com/yinrq/p/4712948.html
View Details核心代码return (T)(object)xxx; 示例代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
public static T GetUnitSettingById<T>(int id) where T : Setting { if (typeof(T).Equals(typeof(BodySetting))) { var body = BodySetting_table.Instance.GetEntityByPrimaryKey(id); if (body!=null) { return (T)(object)body; } } return null; } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/// <summary> /// 从DataRow里获取指定字段的值 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="row"></param> /// <param name="columnName"></param> /// <returns></returns> private T GetValue<T>(DataRow row, string columnName) { var resultObj = new object(); switch (typeof(T).Name.ToLower()) { case "int32": var numInt = 0; if (row.Table.Columns.Contains(columnName)) int.TryParse(row.Field<string>(columnName), out numInt); resultObj = numInt; break; case "int64": var numLong = 0l; if (row.Table.Columns.Contains(columnName)) long.TryParse(row.Field<string>(columnName), out numLong); resultObj = numLong; break; case "decimal": var numDecimal = 0m; if (row.Table.Columns.Contains(columnName)) decimal.TryParse(row.Field<string>(columnName), out numDecimal); resultObj = numDecimal; break; case "string": resultObj = row.Table.Columns.Contains(columnName) ? row.Field<string>(columnName) : string.Empty; break; case "datetime": var outDatetime = new DateTime(); if (row.Table.Columns.Contains(columnName)) DateTime.TryParse(row.Field<string>(columnName), out outDatetime); resultObj = outDatetime; break; } return (T)resultObj; } |
参考:https://blog.csdn.net/iningwei/article/details/88978598
View Details光子:最常见的原因是权限的问题,比如你的log目录没有写入权限,有时可能还要给“完全控制”的权限。 ============================================================================ log4net不输出日志文件主要有以下几个原因: 1 没有在AssemblyInfo文件中添加下面的代码:
|
1 |
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)] |
2 运行程序目录下没有log4net.config配置文件。 解决方法有两种: 手动将log4net.config复制到运行程序 选择解决方案中的log4net.config,在属性–>复制到输出目录,选择始终复制。 3 运行程序目录下没有log4net.dll文件。 解决方案: 手动复制,一般不会出现。 4 log4net的net framework版本与运行程序的版本不一致。 如果在调试中出现以下提示:
|
1 2 3 4 5 |
引发的异常:“log4net.Appender.FileAppender.LockingStream.LockStateException”(位于 log4net.dll 中) 引发的异常:“System.InvalidOperationException”(位于 System.dll 中) 引发的异常:“System.IO.PathTooLongException”(位于 mscorlib.dll 中) 引发的异常:“System.IO.PathTooLongException”(位于 mscorlib.dll 中) 引发的异常:“log4net.Appender.FileAppender.LockingStream.LockStateException”(位于 log4net.dll 中) |
就很有可能是这个原因。 解决方案: 更改log4net版本或者运行程序的net framework版本。 5 log4net.config的配置文件中有错误。 解决方案: 这个问题最难解决,因为你必须要仔细检查每一个设置点。例如我有一次就无法输出日志,最后发现,file节点配置如下:
|
1 |
<file value="\\Log\\Common\\"/> |
更改为
|
1 |
<file value="Log\\Common\\"/> |
期待的日志就出现了。因此,如果前面确定都没有问题的话,你就应该仔细检查一下你的配置文件了。 from:https://blog.csdn.net/sgmcumt/article/details/83021616
View Detailswindows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java which java (java执行路径) echo $JAVA_HOME echo $PATH from:https://blog.csdn.net/Xin7Xin/article/details/86304542
View Details|
1 2 |
//通知一个或多个正在等待的线程已发生事件。 ManualResetEvent manager = new ManualResetEvent(false); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//负责监听的套接字 private Socket socketServer; /// <summary> /// 启动服务 /// </summary> private void CreateSocketService() { try { //获取IP var address = IPAddress.Parse(txtIP.Text.Trim()); //创建一个包含ip port 的网络节点对象 var ipPoint = new IPEndPoint(address, Convert.ToInt32(txtPort.Text.Trim())); //创建一个套接字socket,参数(IP4寻址协议,流式连接,使用TCP协议传输数据) socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //将负责监听的套接字绑定到唯一的IP和端口上 socketServer.Bind(ipPoint); //设置监听队列的长度,同时100个队列 socketServer.Listen(100); //线程开始监听客户端的请求 threadService = new Thread(StartSocketService); //设置线程为后台线程 threadService.IsBackground = true; //启动线程 threadService.Start(); //显示消息 ShowMsg("服务器监听开启成功!"); } catch (Exception e) { ShowMsg(e.Message); } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/// <summary> /// 启动服务监听 /// </summary> private void StartSocketService() { while (true) { try { //将事件状态设置为非终止状态,导致线程阻止 manager.Reset(); //开始监听客户端的连接请求 var args = new SocketAsyncEventArgs(); args.Completed += args_Completed; socketServer.AcceptAsync(args); //WaitHandle receives a signal." data-guid="dd8c3ab0d5ce03487bc8a650ef1c15c8">阻止当前线程,直到当前 WaitHandle 收到信号。 manager.WaitOne(); } catch (Exception ex) { ShowMsg(ex.Message); break; } } } |
|
1 2 3 4 5 6 7 8 9 |
void args_Completed(object sender, SocketAsyncEventArgs e) { //监听完成客户端的请求,一但监听到返回新的套接字 var clientSocket = e.AcceptSocket; //启动线程获取客户端发来的消息 if (clientSocket == null) return; //开始接受消息....... //该函数未写完,第二篇补全 } |
|
1 2 3 4 5 |
void ShowMsg(string message) { //显示消息 txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + message + "\r\n"); } |
ok 服务监听就启动成功了,正等待客户端连接。
|
1 |
ManualResetEvent reviceManager = new ManualResetEvent(false); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public void args_Completed(object sender, SocketAsyncEventArgs e) { //监听完成客户端的请求,一但监听到返回新的套接字 var clientSocket = e.AcceptSocket; if (clientSocket == null) return; //启动线程获取客户端发来的消息 //这部分为接收消息 var t = new Thread(GetClientMsg); //设置线程为后台线程 t.IsBackground = true; //启动线程 t.Start(clientSocket); //显示信息 ShowMsg(clientSocket.RemoteEndPoint + "上线了"); //将事件状态设置为终止状态,允许一个或多个等待线程继续 manager.Set(); } |
建议对照 C# Socket基础(一)之启动异步服务侦听 来看。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
private void GetClientMsg(object socket) { var socketClient = socket as Socket; if (socketClient == null) return; while (true) { try { reviceManager.Reset(); var bytes = new byte[1024 * 1024 * 4]; var receiveArgs = new SocketAsyncEventArgs(); //设置缓冲区 receiveArgs.SetBuffer(bytes, 0, bytes.Length); receiveArgs.Completed += receiveArgs_Completed; //开始异步接收 socketClient.ReceiveAsync(receiveArgs); reviceManager.WaitOne(); } catch (Exception ex) { //显示异常消息 ShowMsg(ex.Message); } } } |
接收消息完成回调事件
|
1 2 3 4 5 6 7 |
void receiveArgs_Completed(object sender, SocketAsyncEventArgs e) { var socketClient = sender as Socket; var bytes = e.Buffer; ShowMsg(socketClient.RemoteEndPoint + "说:" + System.Text.Encoding.UTF8.GetString(bytes)); reviceManager.Set(); } |
又与大家见面,看不懂的随时问。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
private Thread threadClient;//客户端线程 private Socket socketClient;//客户端套接字 /// <summary> /// 创建套接字连接到服务端 /// </summary> private void CreateSocketConnection() { try { //创建一个客户端的套接字 参数(IP4寻址协议,流连接方式,TCP数据传输协议) socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //获取IP IPAddress address = IPAddress.Parse(txtIP.Text.Trim()); //创建一个包含IP和端口号的网络节点对象 IPEndPoint ipPoint = new IPEndPoint(address, Convert.ToInt32(txtPort.Text.Trim())); // 连接服务端 socketClient.Connect(ipPoint); //创建一个线程,接受服务端发来的数据 threadClient = new Thread(ReceiveService); //设置线程为后台线程 threadClient.IsBackground = true; //启动线程连接服务端 threadClient.Start(); //显示消息 ShowMsg("与服务器" + txtIP.Text.Trim() + ":" + txtPort.Text + "成功建立连接!"); } catch (Exception) { ShowMsg(txtIP.Text.Trim() + ":" + txtPort.Text + "服务器未启动!"); } } |
客户端接收消息
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private void ReceiveService() { while (true) { try { int num = -1; var b = new byte[1024 * 1024 * 4]; int length = socketClient.Receive(b); var msg = System.Text.Encoding.UTF8.GetString(b,0,length); ShowMsg(socketClient.RemoteEndPoint.ToString() + "对您: " + msg); } catch (Exception ex) { ShowMsg(ex.Message); break; } } } |
|
1 2 3 4 |
private void ShowMsg(string msg) { txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + msg + "\r\n"); } |
客户端: 服务器: 客户端接收到消息: private Socket socketClient;//客户端套接字,关于实例化请参考C# Socket基础(三)之客户端连接服务器和接收消息 客户端发送消息
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/// <summary> /// 发送数据到服务端 /// </summary> private void Send() { if (socketClient == null) { ShowMsg("服务器未启动!"); return; } byte[] b = System.Text.Encoding.UTF8.GetBytes(txtSend.Text.Trim()); //客户端向服务器发送消息 socketClient.Send(b); //清空文本 ShowMsg("您对" + socketClient.RemoteEndPoint.ToString() + "说:" + txtSend.Text.Trim()); txtSend.Text = ""; } |
关于 ShowMsg(string message);是自定义的函数,在C# Socket基础(一)之启动异步服务侦听 好了,到这里就要告一段落了,实现了基本的客户端和服务器采用TCP协议通信。 看看效果吧: 客户端: 服务器: from:https://www.cnblogs.com/aaa6818162/p/3862159.html
View Details