能否不使用SOAP信封调用ASP.NET webservice实现类REST API效果?
可行解决方案
完全可以实现,传统ASP.NET ASMX Web Service原生支持非SOAP的HTTP GET/POST调用,不需要传递SOAP信封,少量配置和代码改造就能达到接近简单REST API的调用效果,具体实现步骤如下:
1. 开启HTTP GET/POST调用协议
默认配置下ASMX服务通常只开启SOAP协议支持,首先需要在项目的web.config中添加配置,启用非SOAP的HTTP调用能力:
<configuration> <system.web> <webServices> <protocols> <!-- 开启HTTP GET、POST调用支持 --> <add name="HttpGet"/> <add name="HttpPost"/> </protocols> </webServices> </system.web> </configuration>
2. 编写兼容普通HTTP请求的Web方法
给ASMX服务类添加[ScriptService]特性,跳过SOAP信封的校验逻辑,同时给需要支持类REST调用的方法添加[ScriptMethod]特性,指定请求方式和响应格式即可,示例代码如下:
using System.Web.Script.Services; using System.Web.Services; /// <summary> /// 服务类必须添加[ScriptService]特性 /// </summary> [WebService(Namespace = "http://your-service-domain/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class SimpleApi : WebService { /// <summary> /// 支持GET请求,参数直接从URL Query中读取 /// </summary> [WebMethod] [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public object GetUser(int userId) { // 直接编写业务逻辑,返回值会自动序列化为JSON return new { Id = userId, Name = "测试用户", CreateTime = DateTime.Now }; } /// <summary> /// 支持POST请求,可接收表单参数或JSON Body参数 /// </summary> [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public object AddUser(string userName, int age) { var newUser = new { Id = new Random().Next(1, 10000), Name = userName, Age = age }; return new { Code = 0, Msg = "创建成功", Data = newUser }; } }
3. 调用方式(无SOAP信封)
配置完成后就可以像调用普通REST API一样发起请求,完全不需要拼接SOAP结构:
- GET请求示例:直接访问地址
http://你的项目域名/SimpleApi.asmx/GetUser?userId=1001,会直接返回JSON格式结果,无SOAP XML包装 - POST请求支持两种常用格式:
- 表单提交:设置
Content-Type: application/x-www-form-urlencoded,请求地址为http://你的项目域名/SimpleApi.asmx/AddUser,参数按普通表单格式放在请求体中即可 - JSON提交:设置
Content-Type: application/json,请求地址同上,将参数序列化为JSON字符串放在请求体中,例如{"userName":"张三","age":24}
- 表单提交:设置
补充说明
- 如果需要返回纯文本、自定义XML等其他格式,可以直接操作
HttpContext.Current.Response写入返回内容,调用Response.End()提前终止请求即可完全自定义响应格式 - 老项目如果需要更贴合REST的路径风格(比如去掉.asmx后缀、支持路径参数),配合IIS的URL重写规则将对应路径的请求转发到ASMX方法即可,不需要整体重构现有服务
- 这种方案完全基于ASMX原生能力实现,不需要额外引入MVC、WebAPI等框架,改造成本极低,适合存量老服务快速改造
内容的提问来源于stack exchange,提问作者Ashar Hussain
相关产品推荐
相关产品推荐

