TL, DR: при использовании службы SOAP PHP, кажется, всегда требует, чтобы все типы значений были включены в объекты, но .NET, похоже, не предлагает,
У меня есть SOAP-сервис, написанный на .NET (.asmx
), который используется клиентом PHP, разработанным сторонней организацией.
У меня есть [DataMember]
типа Guid
, который представляетникаких проблем с моей стороны, я могу опустить его, когда я инициализирую свой комплексный объект параметра в моем "тестовом" консольном приложении, и никаких ошибок не возникает, вот урезанная версия кода и "тестовое" приложение:
[DataContract]
public class ComplexType
{
[DataMember] public Guid Id {get; set;}
[DataMember] public string Member1 {get; set;}
[DataMember] public string Member2 {get; set;}
}
// -------------------
// this is a console application
var client = new MyServiceRef.MyServiceClient();
var obj = new MyServiceRef.ComplexType
{
Member1 = "Data1",
Member2 = "Data2"
// I don't include here the 'Id' member of ComplexType
};
var ret = client.MyMethod(obj);
// Works with no errors
// Inspecting obj I see 'Id' is auto-initialized as Guid.Empty
// -------------------
Я также протестировал сервис в SOAPUI, пропуск поля в полезной нагрузке не вызывает никаких проблем, и все работает.
С другой стороны, при использовании сервиса в PHP они испытывают этоошибка
SOAP-ERROR: Encoding: object has no 'Id' property
Похоже, что PHP более строг в этом отношении, но я не знаю достаточно о PHP, чтобы дать содержательное предложение.
Временное решение IМожно подумать, что с моей стороны все делается Nullable<T>
: это решит эту конкретную проблему, но является ли это правильным подходом к этой ситуации?