ASMX WebService中HttpContext.Current.Request.PathInfo返回空值问题
解决ASMX Web服务SOAP调用时获取当前方法名的问题
你的问题核心在于浏览器GET请求和SOAP POST请求的路径差异:浏览器直接访问/GetHospitalInfo这类方法路径,所以PathInfo能拿到方法名;但SOAP客户端是把请求发送到.asmx根路径(比如/FarshadWebService.asmx),通过SOAP消息体和SOAPAction头指定要调用的方法,自然拿不到PathInfo值。
下面给你两种可靠的解决方案:
方案1:解析SOAPAction请求头
SOAP请求默认会携带SOAPAction HTTP头,格式通常是类似"http://your-namespace.com/GetHospitalInfo"的字符串,我们可以从中提取方法名:
修改你的GetRequestInfo方法:
private static void GetRequestInfo() { // 获取SOAPAction请求头 string soapAction = HttpContext.Current.Request.Headers["SOAPAction"]; if (!string.IsNullOrEmpty(soapAction)) { // 去除前后引号,截取最后一个斜杠后的方法名 soapAction = soapAction.Trim('"'); Config.FuncName = soapAction.Substring(soapAction.LastIndexOf('/') + 1); } // 兼容浏览器GET请求的场景 else { Config.FuncName = HttpContext.Current.Request.PathInfo.TrimStart('/'); } Config.IP = HttpContext.Current.Request.UserHostName; }
注意:如果你的Web服务自定义了命名空间,要确保解析逻辑和实际的SOAPAction格式匹配。
方案2:在Web方法中直接传递方法名(更可靠)
这种方法不依赖HTTP上下文细节,而是在每个Web方法调用GetRequestInfo时直接传入当前方法名,避免解析请求头可能带来的兼容性问题:
修改你的Web方法和GetRequestInfo:
// 调整GetRequestInfo,新增方法名参数 private static void GetRequestInfo(string funcName) { Config.FuncName = funcName; Config.IP = HttpContext.Current.Request.UserHostName; } // 在Web方法中调用时传递方法名 public HospitalModel GetHospitalInfo() { GetRequestInfo(nameof(GetHospitalInfo)); LogHandler.InsertLogIntoDb(ip: Config.IP, funcName: Config.FuncName); // 你的业务逻辑代码... }
使用nameof运算符可以避免硬编码方法名,后续方法改名时能自动同步,减少出错概率。
补充说明
- 若需要同时支持GET和SOAP POST调用,方案1可以兼容两种场景;
- 方案2的可靠性更高,不依赖HTTP请求细节,更适合复杂服务场景;
- 注意:在ASMX服务的异步方法中,
HttpContext.Current可能为null,需要额外做空值处理。
内容的提问来源于stack exchange,提问作者Farshad
相关产品推荐
相关产品推荐

