2

これが私の現在の状況です。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」メソッドを置き換える方法を見つけようとしています。どんな助けでも大歓迎です。

4

2 に答える 2

3

xsd.exeは、XSDで定義されたオブジェクトを表すクラスファイルを作成するために1回だけ実行されます。次に、XmlSerializerクラスを使用して、XMLを実際にc#クラスに変換(逆シリアル化)します。

C#でのXMLの逆シリアル化について話しているリンクはたくさんあります。

c#でxsdを使用する方法は?

http://msdn.microsoft.com/en-us/library/ms950721.aspx

于 2013-01-31T19:21:29.367 に答える
2

XSD.exeはうまく機能しました。それを機能させるために私が以下で使用した私のコードを見てください:

Process process = new Process();
        string arguments = @" " + row["OutputFileDirectory"].ToString() + row["XSDMainBuildName"].ToString() + " " + row["OutputFileDirectory"].ToString() + row["ImportNames"].ToString() + " /c /language:CS /out:" + row["OutputClassDirectory"].ToString() + " /namespace:" + row["Namespace"].ToString();
        string fileNameXSD = "";
        if (Directory.Exists(@"C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin"))
        {
            fileNameXSD = @"C:\Program Files (x86)\Microsoft SDKs\Windows\v6.0A\bin\xsd.exe";
        }
        else
        {
            fileNameXSD = @"C:\Program Files\Microsoft.NET\SDK\v2.0\Bin\xsd.exe";
        }
        process.StartInfo.Arguments = arguments;
        process.StartInfo.FileName = fileNameXSD;
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.Start();
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();
        if (!DataValidator.ValidateFieldIsBlank(error))
        {
            lblOutputResults.Text = error;
        }
        process.WaitForExit();
        process.Close();

これは私のWebフォームのコードビハインドに入れられました。これにより、ビルドするように選択した各アイテムのxsd.exeプロセスが実行されました。これは、私たちの会社がALOTと呼ぶのに役立ちました。追加情報を提供してくれたすべての人に感謝します。

于 2013-05-13T12:53:51.260 に答える