我正在尝试创建一个将由另一家公司使用的 SOAP Web 服务。该公司希望以某种方式提供数据,因此我创建了一个 WSDL 来反映这一点。 我不需要从 WSDL 自动生成服务,但如果可以的话那就太好了。 我只是想创建一个将使用数据的服务,就像 WSDL 所建议的那样。我正在使用 .net 核心 6.
我尝试过使用 serviceStack 我构建了 envelope/header/body 类,以便它按预期执行。但这似乎有点不稳定,因为我无法查询 WSDL。
如果我的服务指向 https://myurl/web_services/doStuff,
我应该能够查询 https://myurl/web_services/doStuff?WSDL 来获取 WSDL
如果 ServiceStack 不好,我愿意重新启动项目,但托管 WSDL 似乎应该是自动的。
这是我的服务代码:
public class MyServices : Service
{
public object Any(Envelope request)
{
return new EnvelopeResponse(request);
}
// should I have to have this method to get the WSDL?
public object Get(WSDL request)
{
return new WSDLResponse();
}
}
这是我的信封类:
[Route("/web_services/doStuff", "POST")]
[DataContract]
public class Envelope : IReturn<EnvelopeResponse>
{
[DataMember(Name = "Header", Order = 0)]
public Header Header { get; set; }
[DataMember(Order = 1)]
public Body Body { get; set; }
}
当我尝试手动返回 WSDL 时,它会将 WSDL 类序列化为 XML,因此我需要手动构建一个 WSDL 类,这感觉不对。
[Route("/web_services/doStuff", "GET")]
[DataContract]
public class WSDL : IReturn<WSDLResponse> {}
[DataContract]
public class WSDLResponse
{
public WSDLResponse()
{
// return wsdl file contents here?
Result = "wsdL";
}
[DataMember]
public string Result { get; set; }
}
程序.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
app.UseHttpsRedirection();
}
app.UseServiceStack(new AppHost());
app.Run();
我查看了所有相关的 ServiceStack 文档,但找不到任何关于 WSDL 的有用信息
我要么尝试从这个 WSDL 创建一个新服务,要么从同一个 URL 托管一个 WSDL
这几乎肯定不是你应该做的,但我设法让 WSDL 在 get 方法上显示。
我更新了我的服务以导入我手工制作的 WSDL,然后我添加了一个标头以将 WSDL 作为 XML 返回
public class MyServices : Service
{
public object Any(Envelope request)
{
return new EnvelopeResponse(request);
}
[AddHeader(ContentType = MimeTypes.Xml)]
public object Get(WSDL request)
{
return System.IO.File.ReadAllText("myServiceName.wsdl");
}
}