using System; using System.Text; using DotNetty.Buffers; using DotNetty.Codecs.Http; using DotNetty.Common.Utilities; using DotNetty.Transport.Channels; using log4net; namespace BrakeMachine.Brack { public class HttpHandler: SimpleChannelInboundHandler { private static readonly ILog Log = LogManager.GetLogger(typeof(HttpHandler)); static readonly AsciiString TypePlain = AsciiString.Cached("text/plain; charset=utf-8"); static readonly AsciiString TypeJson = AsciiString.Cached("application/json; charset=utf-8"); static readonly AsciiString OkLength = AsciiString.Cached(Encoding.UTF8.GetBytes("true").Length.ToString()); static readonly AsciiString FailLength = AsciiString.Cached(Encoding.UTF8.GetBytes("false").Length.ToString()); static readonly AsciiString ServerName = AsciiString.Cached("Netty"); static readonly AsciiString ContentTypeEntity = HttpHeaderNames.ContentType; static readonly AsciiString DateEntity = HttpHeaderNames.Date; static readonly AsciiString ContentLengthEntity = HttpHeaderNames.ContentLength; static readonly AsciiString ServerEntity = HttpHeaderNames.Server; protected override void ChannelRead0(IChannelHandlerContext ctx, DefaultHttpRequest req) { Log.Info($"{req.Uri}, {req}"); DefaultFullHttpResponse response = null; switch (req.Uri) { case "/Api/Manualsnap"://抓拍 BrackMgr.Manualsnap(); //this.WriteResponse(ctx, Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(closeRfid.ToString())), TypePlain, closeRfid?OkLength: FailLength); break; default: response = new DefaultFullHttpResponse(HttpVersion.Http11, HttpResponseStatus.NotFound, Unpooled.Empty, false); ctx.WriteAndFlushAsync(response); break; } } void WriteResponse(IChannelHandlerContext ctx, IByteBuffer buf, ICharSequence contentType, ICharSequence contentLength) { DateTime dateTime = DateTime.UtcNow; // Build the response object. var response = new DefaultFullHttpResponse(HttpVersion.Http11, HttpResponseStatus.OK, buf, false); HttpHeaders headers = response.Headers; headers.Set(ContentTypeEntity, contentType); headers.Set(ServerEntity, ServerName); headers.Set(DateEntity, AsciiString.Cached($"{dateTime.DayOfWeek}, {dateTime:dd MMM yyyy HH:mm:ss z}")); headers.Set(ContentLengthEntity, contentLength); // Close the non-keep-alive connection after the write operation is done. ctx.WriteAsync(response); } public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) => context.CloseAsync(); public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); } }