Перенесите веб-метод ASMX в WCF, который принимает массив строк

У меня есть одна устаревшая служба ASMX, которая используется многими клиентами (java, .Net, Python и т. д.). Я хочу обновить службу ASMX до WCF, не затрагивая моих клиентов (это означает, что они не будут вносить никаких изменений в свой код).

Ниже функция отлично работает в ASMX:

[WebService(Namespace = "http://example.com/Report", Description = "Save")]
    public class Report : WebService
    {
      
        [WebMethod(Description = "Save")]

        public void Save(string name, string[] skills)
        {
        }
    }

Это означает, что когда клиент вызывает метод Save и передает параметр имени (строки) и навыков (string[]), я получаю их в конце службы и далее сохраняю в базе данных.

В WCF я написал ниже интерфейс и класс:

[ServiceContract(Namespace = "http://example.com/Report")]
public interface IReport
{
    [OperationContract(Action = "http://example.com/Report/Save")]
    void Save(string name, string[] skills);
}

public class Report : IReport
{
    public void Save(string name, string[] skills)
    {
       
    }
}

Когда я вызываю службу WCF из того же устаревшего клиента, я получаю значение имени, но не значение навыков (то есть string[]).

Пожалуйста, помогите, как мне получить значения string[]. Я не могу изменить код клиента.

Я ожидаю, что когда я изменю ASMX на WCF, это будет работать, не влияя на моих клиентов. Я не могу получить значение навыков (это массив строк).

Кажется, в WCF система не может дестерилизовать массив строк. Я пробовал использовать List вместо string[], но тоже не получилось.


73
2

Ответы:

Попробуйте этот код:

[ServiceContract(Namespace = "http://example.com/Report")]
public interface IReport
{
    [OperationContract(Action = "http://example.com/Report/Save")]
    void Save(string name, Skills skills);
}
[DataContract]
public class Skills
{
    [DataMember]
    public string[] Skillsarray { get; set; }
}

public class Report : IReport
{
    public void Save(string name, Skills skills)
    {
       
    }
}

Решено

У меня есть решение. Я создал класс ArrayOfString и добавил атрибут CollectionDataContract. Как показано ниже

[ServiceContract(Namespace = "http://example.com/Report")]
public interface IReport
{
    [OperationContract(Action = "http://example.com/Report/Save")]
    void Save(string name, string[] skills);
}

public class Report : IReport
{
    public void Save(string name, ArrayOfString skills)
    {
       
    }
}


[CollectionDataContract(Name = "ArrayOfString", Namespace = "http://example.com/Report", ItemName = "string")]
   [Serializable]
   public class ArrayOfString : List<string>
   {
   }

Теперь, если клиент вызовет метод, как показано ниже:

ReportClient client = new ReportClient();
client.Save("David", new string[] {".Net", "C#", "WCF"});

В конце службы я получу значения массива в объекте ArrayOfString.

При этом мне не нужно менять своих устаревших клиентов, которые создали прокси (ReportClient) с помощью службы ASMX.