0

私はいくつかのXSDを手に入れました:

<xs:complexType name="myFaultType">
    <xs:sequence>
        <xs:element name="type" type="mns:enumServiceException" />
        <xs:element name="code" type="xs:integer" />
        <xs:element name="message" type="xs:string" />
        <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" />
    </xs:sequence>
</xs:complexType>

<xs:element name="myFault" type="mns:myFaultType" />

<xs:simpleType name="enumServiceException">
    <xs:restriction base="xs:string">
        <xs:enumeration value="constraint" />
        <xs:enumeration value="objectNotFound" />
        <xs:enumeration value="permissionDenied" />
        <xs:enumeration value="runtime" />
        <xs:enumeration value="updateConflict" />
        <xs:enumeration value="versioning" />
    </xs:restriction>
</xs:simpleType>

XSD.exeはこれを生成しました(私の修正を含むコード):

[GeneratedCode("xsd", "2.0.50727.3038")]
[Serializable]
[DebuggerStepThrough]
[DesignerCategory("code")]
[XmlType(Namespace = "http://docs.oasis-open.org/messaging/200908/")]
[XmlRoot("myFault", Namespace = "http://docs.oasis-open.org/messaging/200908/", IsNullable = false)]
public sealed class myFaultType
{
    [XmlElement(Order = 1)]
    public enumServiceException type;

    [XmlElement(Order = 2, DataType = "integer")]
    public string code;

    [XmlElement(Order = 3)]
    public string message;

    [XmlElement(Order = 4)]
    public XmlElement[] any;
}

[GeneratedCode("xsd", "2.0.50727.3038")]
[Serializable]
[XmlType(Namespace = "http://docs.oasis-open.org/messaging/200908/")]
public enum enumServiceException
{
    constraint,
    objectNotFound,
    permissionDenied,
    runtime,
    updateConflict,
    versioning,
}

契約:

    [XmlSerializerFormat]
    public interface IObjectService
    {
        [FaultContract(typeof(myFaultType))]
        DoSomeResponseMessage DoSome(DoSomeRequestMessage message);
    }

問題:

1-これはスタジオによって生成されたWSDLパーツです(順序が間違っています):

<xs:complexType name="myFaultType"><xs:sequence>
<xs:element name="any" nillable="true" type="q1:ArrayOfXmlElement"/>
<xs:element name="code" nillable="true" type="xs:string"/>
<xs:element name="message" nillable="true" type="xs:string"/>
<xs:element name="type" type="tns:enumServiceException"/></xs:sequence></xs:complexType>

2-ProvideFaultのIErrorHandlerでそのコード

var exception = new FaultException<myFaultType>(new myFaultType(), "fault reason");
var messageFault = exception.CreateMessageFault();
fault = Message.CreateMessage(version, messageFault, "http://URL/v1-0/Fault");

その障害メッセージを生成します(順序が間違っています。予期された「http://docs.oasis-open.org/messaging/200908/」の代わりにいくつかのデフォルトの名前空間があります):

<s:Body>
<s:Fault>
  <faultcode>s:Client</faultcode>
  <faultstring xml:lang="ru-RU">fault reason</faultstring>
  <detail>
    <myFaultType xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SomeMyNamespace">
      <any xmlns:d6p1="http://schemas.datacontract.org/2004/07/System.Xml" i:nil="true" />
      <code>0</code>
      <message>repositoryId - invalid format</message>
      <type>invalidArgument</type>
    </myFaultType>
  </detail>
</s:Fault></s:Body>

私は何を間違えますか?

WCFはそのXmlSerializer属性を気にしないようです。

4

1 に答える 1

2

私は何が問題なのかを突き止めました: デフォルトでは、WCF でエラーをシリアル化DataContractSerializerしていくつかのプロパティに変更するXmlSerializer必要があります

[XmlSerializerFormat(SupportFaults=true)]
于 2012-05-18T13:05:14.520 に答える