首页 > 解决方案 > SoapCore 未正确解析 SOAP WSDL 中的数据契约和数据成员

问题描述

将 SoapCore 1.0.0 与 .NET Core 3.1 结合使用来实现较旧的 WCF 服务。我将所有东西都连接起来并生成了一个 WSDL,但是 WSDL 不正确。在这里,我将根据我实际实施的情况来简化案例。

我有一个非常基本的数据模型,并且具有一般形式:

[DataContract]
public class TopLevelInputItem
{
    [DataMember]
    public string SomePrimitiveValue {get; set;}

    [DataMember]
    public NextLevelInputItem SomeComplexValue {get; set;}
}

[DataContract]
public class NextLevelInputItem
{
    [DataMember]
    public string AnotherPrimitiveValue {get; set;}
}

[DataContract]
public class OutputResultItem
{
    [DataMember]
    public List<string> SomeOutputStrings {get; set;}
}

对其进行操作的是一组服务,当然,这些服务与将事物表示为 Web 服务无关,因此我将跳过该代码。这些服务由一组控制器访问,其要点遵循如下模式:

[ServiceContract]
public interface IHandyWebService
{
    [OperationContract]
    public Task<List<OutputResultItem>> UpdateSomethingPlease(
        List<TopLevelInputItem> ListOfThings);
}

public class HandyWebService : IHandyWebService
{
    public async Task<List<OutputResultItem>> UpdateSomethingPlease(
        List<TopLevelInputItem> ListOfThings)
    {
        return await aService.DoAnUpdatesAsync(ListOfThings);
    }
}

API 项目中我的 Startup.cs 的相关部分如下所示:

app.UseSoapEndpoint<IHandyWebService>("/HandyWebService", new BasicHttpsBinding(), SoapSerializer.XmlSerializer);

它实际上只是基本的,但当然还有更多。我的 WSDL 没有通过这种设置正确形成,我希望我能准确地解释正在发生的事情。

对于所描述的方法,我会得到类似的东西:

<wsdl:message name="IHandyWebService_UpdateSomethingPlease_OutputMessage">
    <wsdl:part name="parameters" element="tns:List`1"/>
</wsdl:message>

即,“List`1”规范,与“ArrayOfStrings”或方法中指定并使用DataMember注释的其他类型相反。

此外,对于我的输入对象,原始值的定义根本没有出现在 WSDL 的任何地方。

数据模型和控制器正是基于 WCF 时为该服务准备的,而且一切都很好。我曾预料到能够直接把它全部带过去,但显然情况并非如此。我错过了什么?

也许这个问题的第二部分:在 .NET Core 中使用 SoapCore 实现这个,真的是最好的攻角吗?有没有不同/更好的方法来做到这一点?

标签: c#web-servicessoap.net-corewsdl

解决方案


推荐阅读