У меня есть одна устаревшая служба 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[], но тоже не получилось.
Попробуйте этот код:
[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.