response.write不要放到try里去,不然会报一个错误 a instance object什么的

本文详细解释了在编程过程中遇到Unabletoevaluateexpressionbecausecodeisoptimizedoranativeframeisontopofthecallstack错误的原因,并提供了有效的解决方案,帮助开发者快速定位并解决此类问题。
using CDPT.Integration.DataAccess; using CDPT.Integration.Model; using CDPT.Integration.Utility; using ConsoleApp8; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Web; namespace CDPT.Integration.Service.PTMES4APP { public class APP_Andon : IHttpHandler { private static readonly object locker = new object(); private static TcpServer _server; private static TcpServer server { get { lock (locker) { if (_server == null) { _server = new TcpServer("172.17.12.108", 4000); _server.Start(); } return _server; } } } private static int num = 1; ICamstarAccess dataSource = DataAccessFactory.CreateDataSourceService(); public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; var request = JsonConvert.DeserializeObject<Req_Andon>(JsonHelper.GetRequestJson(context)); var response = new Res_Andon(); if (request == null || request.Message == null) { response = new Res_Andon() { code = "-1", msg = "相关参数不能为空..." }; context.Response.Write(JsonConvert.SerializeObject(response)); return; } try { string sql = $@"select GROUPADD,STATUS,BRACELETADD from pt_andon_info where equipment ='{request.Equipment}' and status = '{request.STATUS}'"; DataTable dt = dataSource.QueryFromCamstar(sql); if (dt != null && dt.Rows.Count > 0) { string msg = SendTdpDataPacket(request.Message, dt.Rows[0][0].ToString()); List<string> listIP = new List<string>(); bool isReturn = false; string returnmsg = ""; for (int i = 0; i < dt.Rows.Count; i++) { string[] segments = dt.Rows[i][2].ToString().Split('.'); string hexString = string.Join(",", segments.Select(s => uint.Parse(s).ToString("X2"))); listIP.Add(hexString); } for (int j = 0; j < listIP.Count; j++) { if (msg.Contains(listIP[j])) { isReturn = true; break; } } returnmsg = isReturn ? "对应同事已收到消息,在来的路上!" : "响应超时,请重试"; response.code = isReturn ? "1" : "2"; response.msg = returnmsg; string uuid = Guid.NewGuid().ToString(); string sql_insert = $@"insert into pt_andonhistory_info(UUID,EQUIPMENT,PACKAGETYPE,INFO,RESPONSIVE,STATUS,DATETIME) values('{uuid}','{request.Equipment}','{request.PACKAGETYPE}','{request.Message}','{returnmsg}','{dt.Rows[0][1]}',sysdate)"; dataSource.ExecuteNonQuery(sql_insert); } else { response.code = "0"; response.msg = "请联系对应人员进行配置"; } } catch (Exception e) { response.code = "-1"; response.msg = $"消息发送失败,{e.Message}"; } finally { context.Response.Write(JsonConvert.SerializeObject(response)); } } private string SendTdpDataPacket(string message, string add) { try { int currentNum; lock (locker) { currentNum = num++; } return server.SendMsg(add, message, currentNum); } catch (Exception ex) { return $"发送失败: {ex.Message}"; } } public bool IsReusable => false; public class Req_Andon { public string Message { get; set; } public string Equipment { get; set; } public string STATUS { get; set; } public string PACKAGETYPE { get; set; } } public class Res_Andon { public string code { get; set; } public string msg { get; set; } } } } using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace CDPT.Integration.Service.PTMES4APP { public class APP_GetConnection : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; // 确保服务器已启动 var server = APP_Andon.server; context.Response.Write("连接建立成功"); } public bool IsReusable => false; } } using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace ConsoleApp8 { public class TcpServer : IDisposable { private TcpListener tcpListener; private readonly IPEndPoint serverIPEndPoint; private readonly Dictionary<string, TcpClient> clientConnections = new Dictionary<string, TcpClient>(); private readonly object locker = new object(); private bool isDisposed = false; public bool IsRun { get; private set; } public TcpServer(string ip, int port) { serverIPEndPoint = new IPEndPoint(IPAddress.Parse(ip), port); } public string SendMsg(string ADD, string message, int Num) { if (string.IsNullOrEmpty(ADD)) return "地址不能为空"; lock (locker) { if (clientConnections.Count == 0) return "没有活动的客户端连接"; // 使用第一个连接的客户端发送消息 var client = clientConnections.First().Value; try { var stream = client.GetStream(); string[] result = ADD.Split('.'); int[] addParts = result.Select(r => Math.Max(0, Math.Min(255, int.Parse(r)))).ToArray(); Num = Math.Max(0, Math.Min(255, Num)); List<byte> messageBytes = new List<byte> { 0x5A, (byte)Num, (byte)addParts[0], (byte)addParts[1], (byte)addParts[2], (byte)addParts[3], 0xE0, (byte)Encoding.GetEncoding("GBK").GetByteCount(message) }; messageBytes.AddRange(Encoding.GetEncoding("GBK").GetBytes(message)); byte checksum = 0; foreach (byte b in messageBytes) { checksum += b; } messageBytes.Add(checksum); stream.Write(messageBytes.ToArray(), 0, messageBytes.Count); return "消息发送成功"; } catch (Exception ex) { return $"发送失败: {ex.Message}"; } } } public void Start() { if (IsRun) return; tcpListener = new TcpListener(serverIPEndPoint); tcpListener.Start(); IsRun = true; Task.Run(() => { try { while (!isDisposed) { var client = tcpListener.AcceptTcpClient(); var remoteIp = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString(); lock (locker) { clientConnections[remoteIp] = client; } } } catch (SocketException) when (isDisposed) { // 服务器正在关闭,忽略异常 } catch (Exception ex) { Console.WriteLine($"服务器错误: {ex.Message}"); } finally { IsRun = false; } }); } public void Stop() { if (isDisposed) return; lock (locker) { isDisposed = true; foreach (var client in clientConnections.Values) { try { client.Close(); } catch { } } clientConnections.Clear(); try { tcpListener?.Stop(); } catch { } } } public void Dispose() { Stop(); } } } 改成和我一样的,一个tcpsever类,两个接口
07-26
2025-09-30 02:23:35.902 INFO 1 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' 2025-09-30 02:23:35.902 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2025-09-30 02:23:35.909 INFO 1 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 7 ms 2025-09-30 02:23:36.035 WARN 1 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'text/xml;charset=UTF-8' not supported]错误信息 代码如下 package com.qq.weixin.mp.aes; import com.alibaba.fastjson.JSON; import com.qq.weixin.mp.dto.WeChatMessageDTO; import com.qq.weixin.mp.dto.WeChatTextDTO; import com.qq.weixin.mp.service.WxService; import com.qq.weixin.mp.util.RedisCache; import lombok.extern.slf4j.Slf4j; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringReader; import java.util.Date; import java.util.Enumeration; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 企业微信验证Url控制层 */ @Slf4j @RestController @RequestMapping("/wx/verify") public class WxVerifyController{ public final static String sToken = "ZO4WR1OqtXQlgB0h"; public final static String sEncodingAESKey = "OcDnluHZoixaCoflYevWASJHei7W0AFu2MoOQB9Kpyc"; public final static String sCorpID = "ww448d6f8683acacd8"; public final static String sCorpsecret = "-5FU-It2-xLM7Woq3QYWedH_E11kIbvCcXe2KKVMWsA"; @GetMapping("/verifyUrl") public void verifyUrl(HttpServletRequest request, HttpServletResponse response) throws IOException { // URL 参数 String sVerifyMsgSig = request.getParameter("msg_signature"); String sVerifyTimeStamp = request.getParameter("timestamp"); String sVerifyNonce = request.getParameter("nonce"); String sEchoStr = request.getParameter("echostr"); try { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID); // 验证 URL String sReplyEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sEchoStr); System.out.println("verifyurl echostr: " + sReplyEchoStr); // 返回验证结果给微信服务器 response.setContentType("text/plain"); response.setCharacterEncoding("UTF-8"); response.getWriter().write(sReplyEchoStr); } catch (Exception e) { e.printStackTrace(); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } } @Resource private RedisCache redisCache; @Resource private RedissonClient redissonClient; @Autowired private WxService wxService; public String getAccessTokenByRedis() { //从redis中获取wx_access_token Object cacheObject = redisCache.getCacheObject("wx_access_token"); //如果存在,直接返回access_token if(cacheObject != null){ return cacheObject.toString(); } //如果不存在,获取分布式锁 RLock lock = redissonClient.getLock("wx_access_token_lock"); //默认未上锁 boolean locked = false; try { //尝试获取锁,最多等待3秒,上锁后10秒自动释放 locked = lock.tryLock(3,10, TimeUnit.SECONDS); //如果获取到锁,再次从redis中获取access_token,防止在上锁期间,其他线程已经获取到锁并更新了access_token。 if (locked) { cacheObject = redisCache.getCacheObject("wx_access_token"); if(cacheObject != null){ return cacheObject.toString(); } String accessToken = getAccessTokenByApi(); //企业微信接口的返回值access_token有效期为7200秒,这存入redis设置为7000秒,防止临界值过期问题。 redisCache.setCacheObject("wx_access_token", accessToken,7000, TimeUnit.SECONDS); return accessToken; }else{ //未取到锁 throw new RuntimeException("获取 access_token 超时,请稍后再试"); } }catch (Exception e){ throw new RuntimeException("Redisson 锁被中断", e); }finally { if(locked && lock.isHeldByCurrentThread()){ lock.unlock(); } } } private String getAccessTokenByApi() { String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + sCorpID + "&corpsecret=" + sCorpsecret; return url; } @PostMapping("/verifyUrl") public String verifyUrl2(HttpServletRequest request, HttpServletResponse response) throws IOException { System.out.println("参数接收成功: "+11); System.out.println("参数接收成功: "+request.getRequestURL()); System.out.println("参数接收成功: "+request.getRequestURI()); // URL 参数 String sVerifyMsgSig = request.getParameter("msg_signature"); String sVerifyTimeStamp = request.getParameter("timestamp"); String sVerifyNonce = request.getParameter("nonce"); String sEchoStr = request.getParameter("echostr"); Enumeration<String> parameterNames = request.getParameterNames(); while (parameterNames.hasMoreElements()){ String parameterName = parameterNames.nextElement(); System.out.println("参数接收成功: "+parameterName); System.out.println("参数接收成功:{} "+request.getParameter(parameterName)); } BufferedReader reader = request.getReader(); String line; StringBuilder body = new StringBuilder(); while ((line = reader.readLine()) != null) { body.append(line); } System.out.println("参数接收成功body: "+body); System.out.println("参数接收成功sVerifyMsgSig: "+sVerifyMsgSig); // <xml><ToUserName><![CDATA[ww448d6f8683acacd8]]></ToUserName> // <Encrypt> //<![CDATA[ZlLc0eCO0X4/10j/XItFN1ecni9eLp8ohfAAHwA5yHxQ9b3aGW/jQlvrv0/PDlrT0VU19nDZBAMblMpZxRq8zKEzgScv36TSoDx+05t4CrdkO8SC0yZWimMvV+FR0uXbxxwvfluf9I/wL4RlckXmhzuYdFU61FCNkNZfPM44JxB9oBF7QUHHszWy+6JPcNCt47FcZQRtrwS0ee8NNT9vsaR8rdbIP1qbqUYw3Wf4C6qP9IylbWxVMRAKXtc384NJBfx8hgrKBGxcOncpAhPiBJkO7UuAkRf32xikHxNsWLIeQAPEsjkNUlB0w9ii3rfhfJrQnmbvMgNECnIJYLfyPkBOuumkKNIkNvQMLDliSXGqyCp7YXGDr3JZRCMho0hWWWvoch7+PCijE7hHXIauDf3M/aU5j3UuKSmA0HiAkdE=]]> //</Encrypt> // <AgentID><![CDATA[1000002]]></AgentID></xml> try { WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID); String sMsg = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, body.toString()); // <xml> // <Encrypt><![CDATA[msg_encrypt]]></Encrypt> // <MsgSignature><![CDATA[msg_signature]]></MsgSignature> // <TimeStamp>timestamp</TimeStamp> // <Nonce><![CDATA[nonce]]></Nonce> // </xml> log.info("消息解密后内容: {}", sMsg); // <xml> // <ToUserName><![CDATA[ww448d6f8683acacd8]]></ToUserName> // <FromUserName><![CDATA[0]]></FromUserName> // <CreateTime>1759039364</CreateTime> // <MsgType><![CDATA[text]]></MsgType> // <Content><![CDATA[你好]]></Content> // <MsgId>7555016542491028570</MsgId> // <AgentID>1000002</AgentID> // </xml> // 使用JSONObject解析XML(注意:实际项目中可能需要使用专门的XML解析库) // JSONObject json = new JSONObject(sMsg); // 提取各个参数 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new ByteArrayInputStream(sMsg.getBytes("UTF-8"))); Element root = document.getDocumentElement(); String toUserName = root.getElementsByTagName("ToUserName").item(0).getTextContent(); String fromUserName = root.getElementsByTagName("FromUserName").item(0).getTextContent(); String createTime = root.getElementsByTagName("CreateTime").item(0).getTextContent(); String msgType = root.getElementsByTagName("MsgType").item(0).getTextContent(); String content = root.getElementsByTagName("Content").item(0).getTextContent(); String msgId = root.getElementsByTagName("MsgId").item(0).getTextContent(); String agentId = root.getElementsByTagName("AgentID").item(0).getTextContent(); log.info("消息解密后内容: {}", msgType); // 处理文本消息 if ("text".equals(msgType)) { // 构建回复消息 String replyMsg = buildReplyMessage(content); WeChatTextDTO weChatTextDTO = new WeChatTextDTO(); weChatTextDTO.setContent(replyMsg); WeChatMessageDTO weChatMessageDTO = new WeChatMessageDTO(); weChatMessageDTO.setTouser(fromUserName);//填入企业ID则是私聊 weChatMessageDTO.setMsgtype("text"); weChatMessageDTO.setAgentid(Integer.valueOf(agentId)); weChatMessageDTO.setText(weChatTextDTO); Map<String,Object> map = wxService.pushMessage(weChatMessageDTO); log.info("消息回复内容: {}", map); } return "回复信息成功"; } catch (Exception e) { e.printStackTrace(); response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } return "回复信息失败"; } @Value("${deepseek.base.url}") private String API_URL; @Value("${deepseek.api.key}") private String API_KEY; /** * 构建回复消息 */ private String buildReplyMessage( String content) { // JSONObject reply = new JSONObject(); // 根据聊天类型设置接收方 // JSONObject stream = new JSONObject(); // stream.put("id", "test123"); // stream.put("finish", false); OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(30, TimeUnit.SECONDS) // 连接超时时间 .readTimeout(30, TimeUnit.SECONDS) // 读取超时时间 .writeTimeout(30, TimeUnit.SECONDS) // 写入超时时间 .build(); // 构建请求体 String jsonBody = "{" + "\"model\": \"deepseek-chat\"," + "\"messages\": [" + " {\"role\": \"user\","+ "\"content\":"+ content+"}" + "]," + "\"stream\": false" + "}"; // 设置请求体和内容类型 MediaType mediaType = MediaType.parse("application/json; charset=utf-8"); okhttp3.RequestBody body = okhttp3.RequestBody.create(jsonBody, mediaType); // 构建请求 Request request = new Request.Builder() .url(API_URL) .post(body) .addHeader("Content-Type", "application/json") .addHeader("Authorization", "Bearer " + API_KEY) .build(); // 发送请求并处理响应 try (Response response = client.newCall(request).execute()) { if (response.isSuccessful() && response.body() != null) { String responseBody = response.body().string(); System.out.println("Response: " + responseBody); } else { System.out.println("Request failed with code: " + response.code()); if (response.body() != null) { System.out.println("Error response: " + response.body().string()); } } } catch (IOException e) { e.printStackTrace(); } return content; } }
最新发布
10-01
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值