You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 6中基于WSDL创建SOAP端点并暴露WSDL的问题

解决方案

方案一:继续用ServiceStack暴露WSDL

ServiceStack本身不自动生成WSDL,但你可以直接返回已编写好的WSDL文件内容,不用序列化对象:

  1. 把你的WSDL文件加到项目里,设置为复制到输出目录(右键文件→属性→复制到输出目录→始终复制)。
  2. 修改WSDL请求的处理方法,直接读取文件并返回正确格式的响应:
public object Get(WSDL request)
{
    // 读取WSDL文件,这里假设文件叫YourService.wsdl,放在项目根目录
    var wsdlContent = File.ReadAllText("YourService.wsdl");
    // 返回XML类型的WSDL内容
    return new HttpResult(wsdlContent, MimeTypes.Xml);
}
  1. 你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:07:54