1

この投稿に情報が多すぎる場合は申し訳ありません。実際の問題に到達する前に、たくさんの話があります。何が悪いのかよくわからないので、関連する可能性のあるものはすべて含めると思いました。

製品データをeコマースサイトに渡すためのWebサービスとクライアント(どちらもVS 2008でC#で記述されています)がありました。XSDは次のように開始されました。

<xs:schema id="Ecommerce"
    elementFormDefault="qualified"
    xmlns:mstns="http://tempuri.org/Ecommerce.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:element name="eur">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="sec" minOccurs="1" maxOccurs="1"/>
   </xs:sequence>

クライアントからサービスに送信されるサンプルドキュメントは次のとおりです。

<eur xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" class="ECommerce_WebService" type="product" method="GetLastDateSent" chunk_no="1" total_chunks="1" date_stamp="2010-03-10T17:16:34.523" version="1.1">
  <sec guid="BFBACB3C-4C17-4786-ACCF-96BFDBF32DA5" company_name="Company" version="1.1">
    <data />
  </sec>
</eur>

次に、サービスにtargetNamespaceを指定する必要がありました。実際、設定する必要があるかどうかはわかりませんが、(同じVSプロジェクトに)完全に無関係なサービス(名前空間も持たない)のクライアントとして機能するコードを追加しましたが、プロジェクトは追加しませんでした。サービスに名前空間を与えるまでビルドします。

これで、XSDは次のように開始されます。

<xs:schema id="Ecommerce"
    elementFormDefault="qualified"
    xmlns:mstns="http://tempuri.org/Ecommerce.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.company.com/ecommerce"
    xmlns:ecom="http://www. company.com/ecommerce">
 <xs:element name="eur">
  <xs:complexType>
   <xs:sequence>
    <xs:element ref="ecom:sec" minOccurs="1" maxOccurs="1" />
   </xs:sequence>

上記のように、すべてのxs:element ref属性を更新して、「ecom」プレフィックスを付けました。これで、プロジェクトが再びビルドされます。

この後、クライアントに変更が必要であることがわかりました。クライアントはSQLストアドプロシージャを使用してXMLを生成します。次に、これはサービスの「get_data」メソッドの正しいタイプのオブジェクトに逆シリアル化されます。オブジェクトのタイプは以前は「eur」でしたが、サービスへのWeb参照を更新した後、「get_dataEur」になりました。そして、XMLの親要素を受け入れるには、「get_dataEur」に変更する必要がありました。次に、奇妙なことに、名前空間を含むxmlns属性を、親要素ではなく「sec」要素(親要素の直接の子)に配置する必要がありました。クライアントからサービスに送信されるサンプルドキュメントは次のとおりです。

<get_dataEur xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" class="ECommerce_WebService" type="product" method="GetLastDateSent" chunk_no="1" total_chunks="1" date_stamp="2010-03-10T18:23:20.653" version="1.1">
  <sec xmlns="http://www.company.com/ecommerce" guid="BFBACB3C-4C17-4786-ACCF-96BFDBF32DA5" company_name="Company" version="1.1">
    <data />
  </sec>
</get_dataEur>

サービスのget_dataメソッドで、着信オブジェクトをシリアル化すると、次のように表示されます(親要素は「eur」で、xmlns属性は親要素にあります)。

<eur xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.company.com/ecommerce" class="ECommerce_WebService" type="product" method="GetLastDateSent" chunk_no="1" total_chunks="1" date_stamp="2010-03-10T18:23:20.653" version="1.1">
  <sec guid="BFBACB3C-4C17-4786-ACCF-96BFDBF32DA5" company_name="Company" version="1.1">
    <data />
  </sec>
</eur>

次に、サービスはクライアントに戻るための応答を準備します。XMLは次のようになります(返送される重要なデータはlast_sent要素のdate_stamp属性です)。

<eur xmlns="http://www.company.com/ecommerce" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" class="ECommerce_WebService" type="product" method="GetLastDateSent" chunk_no="1" total_chunks="1" date_stamp="2010-03-10T18:22:57.530" version="1.1">
  <sec version="1.1" xmlns="">
    <data>
      <last_sent date_stamp="2010-02-25T15:15:10.193" />
    </data>
  </sec>
</eur>

最後に、ここに問題があります!!! クライアントにはデータは表示されません。表示されるのは、内部に何もない親要素だけです。クライアントコードで応答オブジェクトをシリアル化すると、次のようになります。

<get_dataResponseEur xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" class="ECommerce_WebService" type="product" method="GetLastDateSent" chunk_no="1" total_chunks="1" date_stamp="2010-03-10T18:22:57.53" version="1.1" />

だから、私の質問は次のとおりです。

  1. クライアントに返信ドキュメントの内容が表示されないのはなぜですか?

  2. どうすれば修正できますか?

  3. 送信ドキュメントの親要素ではなく子要素にxmlns属性を配置する必要があるのはなぜですか?

ここにもう少し関連性のある情報があります:

クライアントコード(プレネームスペース)は、次のようにサービスメソッドを呼び出しました。

XmlSerializer serializer = new XmlSerializer(typeof(eur));
    XmlReader reader = xml.CreateReader();
    eur eur = (eur)serializer.Deserialize(reader);            
    service.Credentials = new NetworkCredential(login, pwd);
    service.Url = url;
    rc = service.get_data(ref eur);

名前空間が追加された後、次のように変更する必要がありました。

XmlSerializer serializer = new XmlSerializer(typeof(get_dataEur));
    XmlReader reader = xml.CreateReader();
    get_dataEur eur = (get_dataEur)serializer.Deserialize(reader);
    get_dataResponseEur eur1 = new get_dataResponseEur();
    service.Credentials = new NetworkCredential(login, pwd);
    service.Url = url;
    rc = service.get_data(eur, out eur1);
4

1 に答える 1

0

名前空間が追加された後、次のように変更する必要がありました。

ここに名前空間を追加していないようです...次のように、デフォルトの名前空間を XmlSerializer のコンストラクターに追加してみてください。

XmlSerializer serializer = new XmlSerializer(typeof(get_dataEur), "http://www.company.com/ecommerce"
);
XmlReader reader = xml.CreateReader();
get_dataEur eur = (get_dataEur)serializer.Deserialize(reader);
get_dataResponseEur eur1 = new get_dataResponseEur();
service.Credentials = new NetworkCredential(login, pwd);
service.Url = url;
rc = service.get_data(eur, out eur1);

それは役に立ちますか??

于 2010-03-10T19:06:22.867 に答える