Короткий ответ - нет, вы не можете вернуть интерфейс через WebService.
Длинный ответ заключается в том, что вы можете получить желаемое поведение, но оно немного хакерское. Решение состоит в том, чтобы использовать двоичную сериализацию. Таким образом, вы сериализуете свой тип в байты, веб-метод возвращает последовательность байтов, а затем, с другой стороны, вы десериализуете байты обратно в ваш сложный тип.
Например
[WebMethod]
public byte[] GetMyComplexType()
{
IMyComplexType myCt = new MyComplexType();
...
MemoryStream stream = new MemoryStream();
IFormatter fmt = new BinaryFormatter();
fmt.Serialize(stream, myCt);
stream.Flush();
byte[] bytes = stream.ToArray();
stream.Close();
return bytes;
}
Вам нужно будет преобразовать все обратно на другом конце.
byte[] bytes = service.GetMyComplexType();
MemoryStream stream = new MemoryStream(bytes);
BinaryFormatter fmt = new BinaryFomatter();
MyComplexType myCt = fmt.DeSerialize(stream);
Вероятно, вы можете очистить десериализацию, создав универсальный метод. Я должен добавить, что вам нужно убедиться, что вы можете ссылаться на сложный тип на клиенте.
В качестве альтернативы, если они являются вашими интерфейсами, вы могли бы превратить их в абстрактные классы. Однако это не будет работать, если вы хотите, чтобы класс реализовывал несколько интерфейсов (или вы уже наследовали от другого класса), поскольку вы можете наследовать только один класс. Если вам нужно какое-то полиморфное поведение на клиенте, вам нужно использовать атрибут XmlInclude.