OMG! Çok fazla kahve ve bol uyku depravasyonu aldı ama problemimi çözmeyi başardım! Çok basit ...
Önce WSDL'yi beklendiği gibi içe aktarıyorum. Bu, birkaç test edilebilir sınıf oluşturacaktır. Daha sonra, farklı bir ad alanına ihtiyaç duyan her bir Travesti için, ObjectToSOAP() yöntemini geçersiz kılıyorum! (Ve WSDL kaynağına XMLIntf içerir.) Böyle kodu ile Benim durumumda Kumandalı türlerde birçok için:
function AL2.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter; const NodeName, NodeNamespace, ChildNamespace: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode;
begin
Result := inherited ObjectToSOAP(RootNode, ParentNode, ObjConverter, NodeName, '', '', ObjConvOpts, RefID);
end;
Delphi XE çalıştı Hangi.
function ContractdocumentInType.ObjectToSOAP(RootNode, ParentNode: IXMLNode; const ObjConverter: IObjConverter; const Name, URI: InvString; ObjConvOpts: TObjectConvertOptions; out RefID: InvString): IXMLNode;
procedure AlterChildren(Child: IXMLNode);
var
I: Integer;
begin
if (Child.NodeType = ntElement) then Child.SetAttributeNS('xmlns', '', '');
for I := 0 to Pred(Child.ChildNodes.Count) do
AlterChildren(Child.ChildNodes[I]);
end;
begin
Result := inherited ObjectToSOAP(RootNode, ParentNode, ObjConverter, Name, '', ObjConvOpts, RefID);
AlterChildren(Result);
end;
Bence, kesmek: Delphi 2007'de ben giriş tipine birimleri XMLIntf ve XMLDoc artı bu kodu kullanmak zorunda kaldı. Ama bu çok kirli değil. İçeriği kontrol etmek ve uygun ad alanlarını kullanıp kullanmadığını görmek için SOAP isteklerini ve yanıtlarını yakalamaya çalışmak biraz deneme. Ne yazık ki, XE Delphi Delphi 2007.
kadar bunda çok daha iyi bir iş yok Yine de, ben,
Btw, çıkışa
col:
eklemek için ... daha iyi çözümler için açık bu Q tutmak Aynı zamanda bu satırı WSDL
RemClassRegistry.RegisterXSClass(Calculate, 'http://colan.ogconnect.service.wzp/', 'Calculate');
'da değiştirmek zorundaydım:
RemClassRegistry.RegisterXSClass(Calculate, 'http://colan.ogconnect.service.wzp/', 'cal:Calculate');
. Sonuç,
<cal:Calculate xmlns:cal="http://example.webservice/">
olur. Bununla birlikte, daha fazla şeyin yapılması gerekiyor: bu,
xmlns:cal
'u xml başlığına taşıyor. Ama şimdi olduğu gibi, benim için çalışıyor.
başka not: WSDL için aşağıdaki ayarları kullandım: 'literal params gevşeyin' 'yıkıcı üret', 'Bir Outparam dönüş olduğunu', 'Uyarı yorum', ' edebi türleri yayarlar', 'Genişletme için dize eşleştir'. Diğer seçenekler şunlardır: 'Türler ve arabirimler hakkında ayrıntılı bilgiler üretin', 'HTTP Bağlamaları ile portrelerin yoksay', 'Numaralandırma üyelerini doğrula', 'Hata türlerini içe aktar', 'İthalat üstbilgi türleri', 'İşlem dahil ve içe aktarılan şemalar', 'Oluştur sınıf türleri olarak sınıf takma adı ',' Çıkış Parametrelerine İzin Ver 've' Sürükle ve İsteğe Bağlı Öğeleri İşleme '. yayımlama türünde türünde yayınlar pratikti çünkü aradığım tek yöntemle ilgili bir sınıf oluşturur. Ne yazık ki, bu sınıf size çok yardımcı olmaz, ancak sınıf, ObjectToSOAP() yöntemini geçersiz kılarak, zarf içindeki üst düzeydeki SOAP isteğini değiştirmenize yardımcı olur.
Zarfın oluşturulması SOAPEnv birimindedir ve OPToSOAPDomConv biriminde kullanılır. Ne yazık ki, bu ek ad alanını eklemek için başlığı değiştirmek için zarfın kendisine erişmek için kolay bir yöntem bulamadım. Daha sonra, TSOAPDomConv sınıfını ek ad alanı ekleyen kendi sürümümle geçersiz kılabiliyordum. Ama kod şu anda benim için çalışıyor ve babamın söylediği gibi, beni programlamayı öğrendiğinde: Kırılmayan hiçbir şeyi düzeltmeyin.
iyi şanslar. Kirli numaralara başvurmalıydım. –
Evet, biliyorum. Muhtemelen kirli numaralar kullanarak çözebilirim, ancak yönetim buna katılmıyor. Yani kod temiz olmalı. –
SOAP kodu, gönderilen XML'yi incelemeniz ve gerekiyorsa değiştirmeniz için kancalar sağlar. Manuel manipülasyonu açıkça destekler. Ve kod orada olurdu - post-build manipülasyon hakkında hiçbir şey "kirli". Otomatik kadar iyi olmayabilir, ama kimse bunun için endişelenmemeli. – mj2008