Delphi 7 и WCF. Проблема сложного типа - PullRequest
0 голосов
/ 26 сентября 2011

У меня есть служба WCF на основе basicHTTPBinding.Я звоню в эту службу из Delphi 7 и формы .NET.Клиент D7 может успешно вызвать Операцию с примитивным типом ввода и вывода.Однако когда вызывается операция со сложным типом, веб-служба получает сложный тип как NULL.Клиент .Net работает нормально.Здесь представлены заголовки запроса, полученные из Fiddler.

Delphi клиент

<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<SOAP-ENV:Body>

<GetDataUsingDataContract xmlns="http://tempuri.org/">

<composite xmlns="http://schemas.datacontract.org/2004/07/DelphiService2">

<BoolValue>true</BoolValue>

<StringValue>Test</StringValue>

</composite>

</GetDataUsingDataContract>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

.Net Client

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>

<GetDataUsingDataContract xmlns="http://tempuri.org/">

<composite xmlns:a="http://schemas.datacontract.org/2004/07/DelphiService2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

<a:BoolValue>true</a:BoolValue>
<a:StringValue>test</a:StringValue>

</composite>

</GetDataUsingDataContract>

</s:Body>

</s:Envelope>

1 Ответ

2 голосов
/ 26 сентября 2011

Ваша проблема вызвана тем, что клиент Delphi помещает составной элемент, определенный в пространстве имен "http://tempuri.org/" XML " вместо пространства имен "http://schemas.datacontract.org/2004/07/DelphiService2"". Все составные элементы, BoolValue и StringValue должны быть определены в «http://schemas.datacontract.org/2004/07/DelphiService2" XML-пространстве имен (с префиксом псевдонима пространства имен« a: »в данном случае).

Один из способов решения этой проблемы, если клиентский сериализатор Delphi не может быть настроен, состоит в замене предоставленных WCF пространств имен по умолчанию "http://tempuri.org/" и" http://schemas.datacontract.org/2004/07/DelphiService2" тем, который вы определяете сами. Настройте контракт на обслуживание, чтобы соответствовать изменениям , описанным в этом посте , а также измените DataContracts, чтобы соответствовать новому пространству имен XML. Таким образом, все определенные сервисом операции и объекты будут находиться в одном пространстве имен XML.

[DataContract(Namespace="http://YourNamespace/2011/09/DelphiService2")]
public class composite
{
    public bool BoolValue {get; set;}
    public string StringValue {get; set;}
}
...