.NET Core 6中基于WSDL创建SOAP端点并暴露WSDL的问题
解决方案
方案一:继续用ServiceStack暴露WSDL
ServiceStack本身不自动生成WSDL,但你可以直接返回已编写好的WSDL文件内容,不用序列化对象:
- 把你的WSDL文件加到项目里,设置为复制到输出目录(右键文件→属性→复制到输出目录→始终复制)。
- 修改WSDL请求的处理方法,直接读取文件并返回正确格式的响应:
public object Get(WSDL request) { // 读取WSDL文件,这里假设文件叫YourService.wsdl,放在项目根目录 var wsdlContent = File.ReadAllText("YourService.wsdl"); // 返回XML类型的WSDL内容 return new HttpResult(wsdlContent, MimeTypes.Xml); }
- 你的
WSDL类已经绑定了/web_services/doStuff的GET请求,现在访问https://myurl/web_services/doStuff?WSDL就能触发这个方法返回WSDL了。
方案二:换用ASP.NET Core + SoapCore(推荐,原生支持SOAP和WSDL)
如果需要自动匹配或暴露WSDL,SoapCore是.NET Core里做SOAP服务更合适的选择,步骤如下:
1. 安装NuGet包
打开NuGet包管理器,安装SoapCore和System.ServiceModel.Primitives。
2. 定义服务契约(匹配你的WSDL)
如果已有WSDL,用Visual Studio的「添加服务引用」或者svcutil.exe直接生成契约类;手动写的话,要保证命名空间、字段和WSDL完全一致:
[ServiceContract(Namespace = "你的WSDL里的命名空间")] public interface IDoStuffService { [OperationContract(Action = "http://你的命名空间/doStuff", ReplyAction = "http://你的命名空间/doStuffResponse")] EnvelopeResponse DoStuff(Envelope request); } [DataContract(Namespace = "你的WSDL里的命名空间")] public class Envelope { [DataMember(Name = "Header", Order = 0)] public Header Header { get; set; } [DataMember(Order = 1)] public Body Body { get; set; } } // 按WSDL定义Header、Body、EnvelopeResponse等类
3. 实现服务逻辑
public class DoStuffService : IDoStuffService { public EnvelopeResponse DoStuff(Envelope request) { // 这里写你的业务处理逻辑 return new EnvelopeResponse(request); } }
4. 配置Program.cs
var builder = WebApplication.CreateBuilder(args); // 注册SoapCore服务 builder.Services.AddSoapCore(); builder.Services.AddSingleton<IDoStuffService, DoStuffService>(); var app = builder.Build(); // 配置SOAP服务端点 app.UseSoapEndpoint<IDoStuffService>("/web_services/doStuff", new SoapEncoderOptions(), SoapSerializer.XmlSerializer); // 原有中间件配置 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); app.UseHttpsRedirection(); } app.Run();
5. 访问WSDL
启动服务后,直接访问https://myurl/web_services/doStuff?wsdl就能拿到自动生成的WSDL。如果想用你自己写的WSDL,修改配置:
app.UseSoapEndpoint<IDoStuffService>("/web_services/doStuff", new SoapEncoderOptions { WSDLPath = "./YourCustom.wsdl" // 指向你的自定义WSDL文件路径 }, SoapSerializer.XmlSerializer);
方案三:从现有WSDL自动生成服务代码
不管用哪个框架,都可以用工具从WSDL生成契约类:
- Visual Studio:右键项目→添加→服务引用→输入WSDL的URL或本地文件路径,自动生成代码。
- 命令行(svcutil.exe):
svcutil.exe /language:C# /out:ServiceContract.cs /config:App.config 你的WSDL文件路径
生成的代码直接就能用,保证和WSDL的格式完全匹配。
内容的提问来源于stack exchange,提问作者Uuuuuumm
相关产品推荐
相关产品推荐

