如何配置CoreWCF SOAP服务生成单文件扁平WSDL
CoreWCF生成单文件(扁平)WSDL实现方案
CoreWCF原生支持输出无外部引用的单文件扁平WSDL,无需引入第三方依赖,仅需修改元数据导出配置即可实现。
实现原理
默认配置下CoreWCF导出WSDL时,会将数据契约对应的XML Schema拆分为独立XSD文件,通过wsdl:import、xsd:import标签引用外部资源;只要配置WSDL导出器启用内联Schema模式,即可将所有类型定义、WS-Policy策略全部合并到单个WSDL文档中,消除外部依赖。
具体修改步骤
- 确保项目使用1.0及以上正式版本的CoreWCF官方包
- 在现有配置
ServiceMetadataBehavior的代码段,为其指定自定义配置的WsdlExporter,开启内联导出选项
修改后完整代码
using CoreWCF; using CoreWCF.Configuration; using CoreWCF.Description; var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel((context, options) => { options.AllowSynchronousIO = true; options.Listen(System.Net.IPAddress.Any, 5800, listenOptions => { listenOptions.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http1AndHttp2; // 原代码sUrl变量请按实际业务逻辑提前定义 if (sUrl.Scheme == "https") listenOptions.UseHttps(); }); }); builder.Services.AddServiceModelServices().AddServiceModelMetadata(); builder.Services.AddSingleton<IServiceBehavior, UseRequestHeadersForMetadataAddressBehavior>(); var app = builder.Build(); var binding = new WSHttpBinding(SecurityMode.Transport); app.UseServiceModel(builder => { builder.AddService<MyService>() .AddServiceEndpoint<MyService, IMyService>(binding,"MyService"); }); var serviceMetadataBehavior = app.Services.GetRequiredService<ServiceMetadataBehavior>(); serviceMetadataBehavior.HttpsGetEnabled = true; // 启用内联Schema导出,生成单文件无外部依赖的扁平WSDL serviceMetadataBehavior.WsdlExporter = new WsdlExporter { ExportOptions = WsdlExportOptions.InlineSchemas }; app.Run();
验证方式
启动服务后访问WSDL地址(格式为https://<服务地址>:5800/MyService?wsdl),检查返回内容:
- 不存在指向
?xsd=xxx、?wsdl=xxx的外部import标签 - 所有数据类型定义全部包含在WSDL的
<wsdl:types>节点内
即为配置生效。
该配置对服务下所有绑定类型的端点均生效,无需针对单个端点重复设置。
内容的提问来源于stack exchange,提问作者Michalor
相关产品推荐
相关产品推荐

