Я пытаюсь обновить некоторый код WSE для использования WCF, и у меня возникают проблемы с одной услугой в частности. Когда я создавал свой прокси-класс из WSDL, он создает методы без параметров или возвращаемого типа. Параметры были достаточно легкими для исправления - сохранили автоматически созданный файл References.cs
как новый файл, добавили параметр как к сгенерированному интерфейсу, так и к сгенерированному клиенту, и он работает. Используя Fiddler, я вижу, что трафик как ожидалось.
То, что я нахожу очень досадно, заключается в том, что WCF, похоже, просто отбрасывает полезную нагрузку. Я вижу, как он возвращается по проводам, но, похоже, он просто исчезает где-то в глубоких темных трещинах WCF. Никаких ошибок или предупреждений, просто нет.
Я вроде как здесь. Я бы очень признателен за любые предложения о том, как определить, куда идет ответ.
Метод в клиенте (это используется для возврата void
, я установил его для object[]
в надежде, что смогу получить что-то, что я мог бы сделать):
public object[] getAddress(string user) {
return base.Channel.getAddress(user);
}
Метод в интерфейсе:
[System.ServiceModel.OperationContractAttribute(Action = "https://xxxxxx/Address#getAddress", ReplyAction = "*")]
[System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, SupportFaults=true, Use=System.ServiceModel.OperationFormatUse.Encoded)]
object[] getAddress(string user);
Необработанный ответ XML (отредактированный) выглядит примерно так:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getAddressResponse xmlns="https://xxxxx/Address">
<ArrayOfAddress arrayType="xsd:Address[3]" soapenc:arrayType="xsd:anyType[3]" xsi:type="Array">
<Address>
<street xsi:type="xsd:string">3rd</street>
</Address>
<Address>
<street xsi:type="xsd:string">1st</street>
</Address>
<Address>
<street xsi:type="xsd:string">2nd</street>
</Address>
</ArrayOfAddress>
</getAddressResponse>
</soap:Body>
Заранее спасибо!
EDIT: мне не удалось решить эту проблему, и на этой службе есть всего несколько методов, поэтому я просто вручную взаимодействовал с сервисом с помощью WebClient, минуя WCF.
Возвращаемый объект [] не даст вам то, что вы можете сделать. WCF для клиента должен знать возможные конкретные типы для десериализации ответа. Я бы ожидал исключения.
Чтобы исправить это, вы должны пойти дальше и создать класс контракта данных адреса.