SoapCore неправильно анализирует контракт данных и элемент данных в SOAP WSDL - PullRequest
0 голосов
/ 27 марта 2020

Использование SoapCore 1.0.0 с. NET Core 3.1 для реализации более старой службы WCF. У меня все готово и я создаю WSDL, но WSDL не верный. Здесь я упросту случаи из того, что я реализовал, на самом деле.

У меня есть модель данных, которая довольно проста c, и в общем виде:

[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;}
}

Работа с этим набором сервисов, которые, конечно, не связаны с представлением вещи как веб-сервиса, поэтому я пропущу этот код. Сервисы доступны через набор контроллеров, суть которых состоит в следующем:

[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);
    }
}

Соответствующая часть моего Startup.cs в проекте API выглядит следующим образом:

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

Это действительно просто основа c, но, конечно, намного больше. Мой WSDL формируется неправильно с этой настройкой, и я надеюсь, что смогу объяснить с определенной точностью, что происходит.

Для описанного метода я получу что-то вроде:

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

Т.е. спецификация "List`1", а не что-то вроде "ArrayOfStrings" или другого типа, указанного в методе и аннотированного с помощью DataMember.

Кроме того, для моих входных объектов определены определения Примитивные значения вообще не отображаются нигде в WSDL.

Модель данных и контроллеры - это именно то, что было для службы, когда она была основана на WCF, и все это работало великолепно. Я ожидал, что смогу все это переносить, но, видимо, это не так. Чего мне не хватает?

Возможно, часть II этого вопроса: реализует ли это в. NET Core, с SoapCore, действительно лучший угол атаки? Есть ли другой / лучший способ сделать это?

...