0

Java アプリから使用したい WCF サービスを作成しています。しかし、問題は .net-java 相互運用性に関するものではありません。

ポイントは、サービス操作に関係する型の1つがIXmlSerializableであることです。その型は、XmlSchemaProviderAttribute によって参照される静的メソッドを使用して XSD スキーマを返します。問題は、mex-endpoint ( http://..svc?wsdl ) を介してサービスの wsdl を取得すると、そのスキーマが返されないことです。

詳細はこちら。

一部の wcf サービス コントラクト:

 [ServiceContract]
 public interface IService1
 {
  [OperationContract]
  DomainData GetData();
 }

DomainData タイプは次のとおりです。

 [DataContract(Namespace = "http://schemas.biz.org/Samples/customserialization")]
 public class DomainData
 {
  [DataMember(Name = "AuxData")]
  Dictionary<String, AuxDomainData> m_auxData = new Dictionary<string, AuxDomainData>();

  [DataMember]
  public string ObjectId { get; set; }

  public IDictionary<string, AuxDomainData> AuxData
  {
   get { return m_auxData; }
  }
 }

ご覧のとおり、DomainData には AuxDomainData オブジェクトのディクショナリが含まれています。

 [XmlSchemaProvider("GetXmlSerializationSchema")]
 public class AuxDomainData : IXmlSerializable
 {
  [DataMember]
  public Object AuxData { get; set; }

  XmlSchema IXmlSerializable.GetSchema() { return null; }

  void IXmlSerializable.ReadXml(XmlReader reader) { }

  void IXmlSerializable.WriteXml(XmlWriter writer) { }

  public static string Namespace = "http://schemas.biz.org/Samples/customserialization";

  public static XmlQualifiedName GetXmlSerializationSchema(XmlSchemaSet schemas)
  {
   var qname =  new XmlQualifiedName("AuxDomainData", Namespace);
   string resourceName = "CustomSerialization.aux-domain-data.xsd";
   using (Stream stream = typeof(AuxDomainData).Assembly.GetManifestResourceStream(resourceName))
   {
    var schema = XmlSchema.Read(stream, null);
    schemas.Add(schema);
   }
   return qname;
  }
 }

ここでは、GetXmlSerializationSchema メソッドで XSD スキーマを返しています。スキーマ自体は簡単ですが、ここでは割愛させてください。

そのコードは簡単だと思いますが、これは IXmlSerializable 型の一般的なシナリオです。

ここで、WSDL が必要です。Metroの助けを借りて WSDL を使用して Java クライアントを作成しますが 、実際には JDK 1.6 で十分です。WS スタック (および wsimport.exe) が含まれているからです。したがって、Java は wsdl:service 定義で wsdl を必要とします。そのため、wsdl.exe から wsdl を渡すことができません (wsdl によって生成された wsdl には wsdl:service 定義が含まれておらず、wsdl:portType のみが含まれているため)。そこで、wsimport.bat http://localhost/Service1.svc?wsdlを呼び出します。

しかし、私がレスポーズで得たものは次のとおりです。

これは、構成された wsdl には実際には AuxDomainData などの型が含まれていないためです。それは真実であり、java/metro/その他のスタックを非難することはできません。wcf によって生成された wsdl を見ると、すべての xsd スキーマをインポートする wsdl:types 要素が含まれています。

<wsdl:types>
  <xsd:schema targetNamespace="http://tempuri.org/Imports">
    <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/" /> 
    <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/" /> 
    <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd2" namespace="http://schemas.biz.org/Samples/customserialization" /> 
    <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd3" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
  </xsd:schema>
</wsdl:types>

ここですべての xsd を提供することはしませんが、要点はそれらに AuxDomainData 定義がないことです。AuxDomainData タイプの xsd-schema はhttp://localhost/CustomSerialization/Service1.svc?xsd=xsd 4 "document" にあります。しかし、ご覧のとおり、ルート wsdl にはそれへの参照が含まれていません。それが問題です。結果の wsdl/xsd スキーマ セットは完全ではありません。

それで、私のオプションは何ですか?

4

2 に答える 2

0

実際、「http://blogs.msdn.com/dotnetinterop/archive/2008/09/23/flatten-your-wsdl-with-this-custom-servicehost-for-wcf.aspx」からAaronソリューションによって提案されたものは完全に正しくないこと。アイデア自体ではなく、コードです。そのExportExtensionをいくつかのサービスに使用した後、wsdlに次のサービスを要求すると、タイプが重複しているためにサービスが失敗します。

また、msdnフォーラムで質問しました:http ://social.msdn.microsoft.com/Forums/en-US/wcf/thread/0ea27bec-08cc-4a20-86ce-6e3477abb1c5 。

于 2009-12-11T16:32:25.370 に答える
0

WSDL がそれを参照していないと確信していますか? 通常、WCF は <wsdl:message> 要素のリストの直前に次のような要素を含めます。

<wsdl:types>
    <xsd:schema targetNamespace="http://tempuri.org/Imports">
        <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
        <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
        <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/MyServiceNamespace"/>
        <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/MyServiceNamespace.AnotherNamespace"/>
        <xsd:import schemaLocation="http://localhost/CustomSerialization/Service1.svc?xsd=xsd4" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
    </xsd:schema>
</wsdl:types>

これを確認してください。そこにあるはずです。ただし、Java がそれを認識していない可能性があります。

それが問題である場合、 WSDL を平坦化する方法があります。あなたはそれを試すかもしれません。

ちなみに、mex エンドポイントは通常Service1.svc/mexです。WSDL は少し異なります。

于 2009-12-08T18:39:34.287 に答える