Динамически создавать данные веб-сервиса - PullRequest
0 голосов
/ 19 октября 2018

У меня есть веб-сервис, который должен возвращать данные.

[DataMember]
public Int32 RequestId
{
    get { return requestId; }
    set { requestId = value; }
}

[DataMember]
public string StatusCode
{
    get { return statusCode; }
    set { statusCode = value; }
}

[DataMember]
public List<string> ErrorMessages
{
    get { return errorMessages; }
    set { errorMessages = value; }
}

[DataMember]
public string PeriodStatus
{
    get { return status; }
    set { status = value; }
}
[DataMember]
public string PhoneNumber
{
    get { return status; }
    set { status = value; }
}

Теперь некоторые пользователи сервиса хотят получить номер телефона, другие не хотят получать это поле.

Эти предпочтения хранятся в базе данных.

Есть ли способ сделать ответ динамически в зависимости от того, выбрали ли они получить поле или нет?

1 Ответ

0 голосов
/ 19 октября 2018

Я думаю, что вы не можете изменить возвращаемые данные из сервиса во время выполнения, потому что у клиента есть пакет файлов, включая wsdl в качестве описания веб-сервиса.Более того, когда веб-служба была изменена, клиенту необходимо обновить веб-ссылки.

В вашем случае, когда вы не знаете, сколько полей должны возвращаться из службы, вы можете вернуть коллекцию полей.

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[XmlInclude(typeof(CustomFieldCollection))]
[XmlInclude(typeof(CustomField))]
[XmlInclude(typeof(CustomField[]))]
public class Service : System.Web.Services.WebService
{

    public Service()
    {
    }

    [WebMethod]
    public CustomFieldCollection GetFieldsCollection()
    {
        CustomFieldCollection collection = new CustomFieldCollection();
        collection["fieldA"] = 1;
        collection["fieldB"] = true;
        collection["fieldC"] = DateTime.Now;
        collection["fieldD"] = "hello";
        CustomFieldCollection collection1 = new CustomFieldCollection();
        collection1["fieldA"] = 1;
        collection1["fieldB"] = true;
        collection1["fieldC"] = DateTime.Now;
        collection1["fieldD"] = "hello";
        collection.Collection[0].CustomFields = collection1;
        return collection;
    }
}
public class CustomFieldCollection
{
    private List<CustomField> fields = new List<CustomField>();

    public object this[String name]
    {
        get { return fields.FirstOrDefault(x => x.Name == name); }
        set
        {
            if (!fields.Exists(x => x.Name == name))
            {
                fields.Add(new CustomField(name, value));
            }
            else
            {
                this[name] = value;
            }
        }
    }

    public CustomField[] Collection
    {
        get { return fields.ToArray(); }
        set { }
    }
}


public class CustomField
{
    public string Name { get; set; }
    public object Value { get; set; }
    public CustomFieldCollection CustomFields { get; set; }

    public CustomField()
    {
    }

    public CustomField(string name, object value)
    {
        Name = name;
        Value = value;
    }
}

Вы можете изменить метод GetFieldsCollection, возвращая коллекцию полей для определенного типа, переданных в качестве параметра.

...