标签:
最近在做一个Linux平台上基于ASP.Net 5 中间件+Redis+Mysql架构的系统,研究使用了
StackExchange.Redis 作为asp.net5连接redis的工具。作者在前几天开了一个新的分支“CoreCLR”开始对asp.net5的进行升级开发。并且有一个pull request跟踪相关的问题。在Windows开发机上测试一切都可以正常执行。迁移到Linux上的Docker容器里执行后发现,asp.net5的中间件程序在通过StackExchange.Redis连接本地的redis服务时会发生如下错误:
System.PlatformNotSupportedException: Operation is not supported on this platform. at System.Net.Sockets.SocketPal.Ioctl(SafeCloseSocket handle, Int32 ioControlCode, Byte[] optionInValue, Byte[] optionOutValue, Int32& optionLength) at System.Net.Sockets.SocketPal.Ioctl(SafeCloseSocket handle, Int32 ioControlCode, Byte[] optionInValue, Byte[] optionOutValue, Int32& optionLength) at System.Net.Sockets.Socket.IOControl(Int32 ioControlCode, Byte[] optionInValue, Byte[] optionOutValue) at StackExchange.Redis.SocketManager.SetFastLoopbackOption(Socket socket)
public static SocketError Ioctl(SafeCloseSocket handle, int ioControlCode, byte[] optionInValue, byte[] optionOutValue, out int optionLength) { // TODO: can this be supported in some reasonable fashion? throw new PlatformNotSupportedException(); }
OK,看来虽然准备实现,但确实还未实现。好吧,暂时自己动手和改下StackExchange.Redis代码。改为:
... internal SocketToken BeginConnect(EndPoint endpoint, ISocketCallback callback, ConnectionMultiplexer multiplexer, TextWriter log) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { SetFastLoopbackOption(socket); } catch { } socket.NoDelay = true; try { ...
这是一个暂时的绕过方案,使你至少可以在Linux上跑的asp.net5程序可以顺利连接Redis。缺点是,连接本地Redis服务时,并未使用环回(Loopback)方式,使得原本应该有的本地连接性能提升没有体现出来。相信.net5的Sockets基础类进一步改进后。该性能提升还是会有的。
在Linux平台上用ASP.NET 5 连接Redis服务器
标签:
原文地址:http://www.cnblogs.com/noahv/p/5064652.html