你的位置:首页 > 操作系统

[操作系统]在Linux平台上用ASP.NET 5 连接Redis服务器

最近在做一个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)

研究后发现,Github上托管的.Net代码中有这样一段:
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基础类进一步改进后。该性能提升还是会有的。Technorati 标记: ASP.NET5,.NET跨平台,Redis,Corefx,StackExchange.Redis