これが私の現在の状況です。Webサービスの呼び出し方法の基準を破らなければなりませんでした。接続するWSDLが60以上あり、パラメーターに基づいて名前が変更されました。WebClientを使用して動的にWebサービス呼び出しを作成し、エンベロープを手動で作成しました(上級管理職が各Webサービスを追加する代わりにこれを行うことにしました)。XSDに一致する有効なXMLを持つ文字列応答が返されます。WSDLごとのクラスではなく、フィールドを動的に参照するクラスを作成する方法を理解しようとしています(使用されているXSDに基づいてクラスを構築します)。これが私がしていることです:
public string results;
using (WebClient client = new WebClient())
{
string soapENV = @"http://schemas.xmlsoap.org/soap/envelope/";
var payload = @"<?xml version=""1.0"" encoding=""utf-8""?>" +
"<SOAP-ENV:Envelope xmlns:SOAP-ENV='" + soapENV + "'>" +
"<SOAP-ENV:Header/>" +
"<SOAP-ENV:Body>" +
"<" + myParams.requestName + " xmlns='" +
myParams.requestNamespace + "'>" +
"<MtvnSvcVer>1.0</MtvnSvcVer>" +
"<MsgUUID>" + UUID + "</MsgUUID>" +
"<PrcsParms>" +
"<SrcID>" + currentVendorID + "</SrcID>" +
"</PrcsParms>"
................
"</SOAP-ENV:Body>" +
"</SOAP-ENV:Envelope>";
this.results = client.UploadString (URL, payload);
}
時間とスペースを節約するために、いくつかのXMLタグを取り出しました。XSD応答には、上記と同じXMLタグの値があります。次に、これを次のように実行するように呼び出します。
string results = connectwareService.InvokeConnectWare();
返される結果は次のようになります。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<DPNmeAddrInqMtvnSvcRes xmlns="mtvnCWDPNmeAddrInqSvcRes">
<MtvnSvcVer>1.0</MtvnSvcVer>
<MsgUUID>DATA HERE</MsgUUID>
<Svc>
<SvcParms>
<ApplID>DATA HERE</ApplID>
<SvcID>DATA HERE</SvcID>
<SvcVer>1.0</SvcVer>
<RqstUUID>DATA HERE</RqstUUID>
</SvcParms>
<MsgData>
<DPNmeAddrInqResData xmlns="mtvnCWDPNmeAddrInqResData">
<E20007>DATA HERE</E20007>
........
</soapenv:Body>
</soapenv:Envelope>
これを行う方法はコードにありますか?私はpeopeleがxsd.exeの使用を参照しているのを見続けています。それはコードビハインドで実行できますか?最後の手段として、タグ名を名前として、データを値としてジェネリッククラスを読み、データを入力できると考えていましたが、コードでその場でこれを生成する方法が必要です。私ができる別の方法は、60以上のwsdlをすべて読み取り、xsd.exeを実行して必要なクラスを構築することだと思いますか?
また、参考までに、古いCold FusionコードをC#に変換していて、その「ConvertXmlToStruct」メソッドを置き換える方法を見つけようとしています。どんな助けでも大歓迎です。