Пользовательская ошибка SOAP имеет неправильное пространство имен http://schemas.datacontract.org/2004/07/ - PullRequest
2 голосов
/ 14 июля 2010

Я определил пользовательскую схему для мыльной ошибки, которая выглядит следующим образом: ... ...

Я создал код в VS 2008:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3053")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.zurich.com/zsoa/corporate/common/2008/08/fault")]
[System.Xml.Serialization.XmlRootAttribute("zsoaFault", Namespace="http://schemas.zurich.com/zsoa/corporate/common/2008/08/fault", IsNullable=false)]
public partial class ZSOAFault : AbstractFault
{

...

Я разработал пользовательский IErrorHandler (часть инфраструктуры, поставляемой для всех проектов), который генерирует эту нестандартную ошибку мыла следующим образом:

Schemas.ZSOAFault.ZSOAFault zfault = new Schemas.ZSOAFault.ZSOAFault();
zfault.message = "hello";
zfault.operation = "operation";
zfault.serviceContext = "serviceContext";
zfault.serviceEndpoint = "serviceEndpoint";
zfault.timeStamp = DateTime.Now;

FaultException<Schemas.ZSOAFault.ZSOAFault> fe = new FaultException<Schemas.ZSOAFault.ZSOAFault>(zfault);        
MessageFault msgFault = fe.CreateMessageFault();

Важно, чтобы класс Schemas.ZSOAFault.ZSOAFault был сгенерирован из схемы, а не из приложения wsdl, которое также импортирует ту же схему.

Но когда я смотрю на это возвращенное мыло, я вижу другое пространство имен:

     <detail>
        <ZSOAFault xmlns="http://schemas.datacontract.org/2004/07/Schemas.ZSOAFault" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
           <message>hello</message>
           <exception i:nil="true"/>
           <operation>operation</operation>
           <serviceContext>serviceContext</serviceContext>
           <serviceEndpoint>serviceEndpoint</serviceEndpoint>
           <timeStamp>2010-07-14T14:31:58.5437649+02:00</timeStamp>
        </ZSOAFault>
     </detail>

Я ожидал увидеть свое пространство имен пользовательского определения ошибки в схеме или я не прав?

Спасибо, Оливер

1 Ответ

2 голосов
/ 14 июля 2010

Кажется, я помню, что пользовательские ошибки в WCF должны быть контрактами данных и никогда не использовать XmlSerializer, поэтому те атрибуты сериализатора Xml, которые вы используете, будут игнорироваться.Вместо этого используйте атрибут [DataContract]:

[DataContract(Name="zsoaFault", Namespace="http://schemas.zurich.com/zsoa/corporate/common/2008/08/fault")]
public partial class ZSOAFault : AbstractFault {
....
}
...