0

ローカル WSDL を使用して、プロジェクトに SAP Netweaver サービス参照を追加しました。サーバーは null 応答を返しますが、Fiddler を使用すると、正しい応答が送信されていることがわかります。これは、応答が正しく逆シリアル化されていないことを意味すると思います。これは、ルート レスポンス要素が WSDL でどのように定義されるかです。

<xsd:element name="adrl">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="adr" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

子要素 (一部のフィールドが省略されています):

<xsd:element name="adr">
    <xsd:complexType>
        <xsd:sequence>
            <xsd:element ref="id"/>
        </xsd:sequence>
        <xsd:attribute name="op" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:NMTOKEN">
                    <xsd:enumeration value="update"/>
                    <xsd:enumeration value="delete"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:complexType>
</xsd:element>

応答:

<wsdl:output message="p1:p2.adrl"/>

名前空間:

xmlns:p1="urn:mycompany:outbound"
xmlns:p2="http://tempuri.org/mycompany" 

サービスからの SOAP 応答:

<SOAP:Envelope xmlns:SOAP='http://schemas.xmlsoap.org/soap/envelope/'>
    <SOAP:Header/>
    <SOAP:Body>
        <adrl>
            <adr op='update'>
                <id>9AF1FBA0-81A4-4427-A011-0DCE3BD1F609</id>
            </adr>
        </adrl>
    </SOAP:Body>
</SOAP:Envelope>

WCF クラス定義 (Reference.cs から):

// Some namespaces elided

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://tempuri.org/mycompany")]
public partial class adr : object, System.ComponentModel.INotifyPropertyChanged {

    private string idField;

    // adrOP has a suitable enumeration defined elsewhere in the file
    private adrOP opField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Order=0)]
    public string id {
        get {
            return this.idField;
        }
        set {
            this.idField = value;
            this.RaisePropertyChanged("id");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public adrOP op {
        get {
            return this.opField;
        }
        set {
            this.opField = value;
            this.RaisePropertyChanged("op");
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
public partial class GetAdrResponse {

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://tempuri.org/mycompany", Order=0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("adr", IsNullable=false)]
    public adr[] adrl;

    public GetAdrResponse() {
    }

    public GetAdrResponse(adr[] adrl) {
        this.adrl = adrl;
    }
}

Fiddler でキャプチャした応答を (ルート要素として adrl を使用して) 手動で逆シリアル化しようとすると、Xml エラーが発生し、内部例外メッセージ "" は予期されませんでした。シリアライザーにルート要素を追加すると、エラーは消えますが、「op」属性のみが適切に逆シリアル化されます。残りのフィールドは null です。

何が問題なのですか?私は実際にはサービスにアクセスできませんが、そこで変更する必要がある場合は、リクエストを転送できます。それ以外の場合は、MessageInspector を追加して応答を変更することを検討していますが、どのように変更する必要があるかはよくわかりません。

編集: C# でオブジェクトを作成し、逆シリアル化した結果が次のとおりです。

<?xml version="1.0" encoding="utf-16"?>
<ArrayOfAdr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <adr op="update">
    <id>9AF1FBA0-81A4-4427-A011-0DCE3BD1F609</id>
  </adr>
</ArrayOfAdr>

シリアル化に関して、ルート要素が適切に定義されていないようです。

4

1 に答える 1

1

SAP Netweaver EJB DC で WCF サービスを使用しようとしたときに、同じ問題が発生しました。WCF サービスの各操作に XmlSerializerFormat タグを追加し、データ コントラクトに XmlRoot タグを追加して、この問題を解決しました。

    [XmlRoot(Namespace = "urn:sap.com:WS:Service1", ElementName = "Entity1")]
    [DataContract]
    public class Entity1
    {
    // your properties
    }

    [ServiceContract(Namespace = "urn:sap.com:WS:Service1", Name = "IService1")]
    public interface IService1
    {
        [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]
        [OperationContract]
        Entity1 GetById(int id);

      [XmlSerializerFormat(Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)] 
        [OperationContract]
        string Save(Entity1 entity);
    }

    [ServiceBehavior(Namespace = "urn:sap.com:WS:Service1", Name = "Service1")]
    [BindingNamespaceBehavior(bindingNamespace = "urn:sap.com:WS:Service1")]
    public class Service1 : IService1
    {
    Entity1 GetById(int id)
    {
        // your code
    }

    string Save(Entity1 entity)
    {
       // your code
    }
    }
于 2013-12-04T09:56:43.310 に答える