私は、既存のXmlDataContractSerializerOutputFormatterを拡張したXmlWriterオブジェクトを作成する方法を活用し、それを包むことになりましたレスポンスを編集することは、フレームワークによって表されるレスポンスオブジェクトの構造のために実際には実現可能な解決策ではなかったため、機能を編集するためのアダプタが必要でした。名前空間の書き込みを無効にするフォーマッタ
public class CustomDataContractOutputFormatter : XmlDataContractSerializerOutputFormatter
{
public CustomDataContractOutputFormatter() : base(){}
public CustomDataContractOutputFormatter(XmlWriterSettings set) : base(set){}
public override XmlWriter CreateXmlWriter(TextWriter writer, XmlWriterSettings xmlWriterSettings)
{
var bas = base.CreateXmlWriter(writer, xmlWriterSettings);
var ret = new XmlWriterNoNamespace();
ret.AdaptedWriter = bas;
return ret;
}
}
ハックとベースアダプタ(その一部)
public class XmlWriterAdapter : XmlWriter
{
XmlWriter _adaptedWriter;
public XmlWriterAdapter():base(){}
public XmlWriter AdaptedWriter
{
get
{
return _adaptedWriter;
}
set
{
this._adaptedWriter = value;
}
}
public override WriteState WriteState { get{return _adaptedWriter.WriteState;} }
public override void Flush()
{
_adaptedWriter.Flush();
}
public override string LookupPrefix(string ns)
{
return _adaptedWriter.LookupPrefix(ns);
}
}
そして最後に、特定のアダプタ
まず
public class XmlWriterNoNamespace : XmlWriterAdapter
{
bool _skipAttribute;
public XmlWriterNoNamespace():base(){}
public override void WriteEndAttribute()
{
if(_skipAttribute)
{
_skipAttribute = false;
return;
}
base.WriteEndAttribute();
}
public override void WriteStartAttribute(string prefix, string localName, string ns)
{
if(prefix.Equals("xmlns"))
{
_skipAttribute = true;
return;
}
base.WriteStartAttribute(prefix, localName, ns);
}
public override void WriteString(string text)
{
if(_skipAttribute)
return;
base.WriteString(text);
}
}
私は実際に最終的な手段としてxmlを手作業で編集し、フレームワークの提供されたファシリティーを利用しようとしていますただし、すべてが失敗した場合は、XmlDataContractSerializerOutputFormatterではなくカスタムフォーマッタを作成するか、または可能であればカスタムミドルウェアでレスポンスを変更することがあります。 – Michael
このソリューションは機能しますか? – imsome1
私はxmlに直接アクセスしていないと言いました。フォーマッタがそれを処理します。私ができることは、DataContractやDataMember属性クラスなどの属性クラスを使用してモデルを修飾し、Namespaceプロパティを変更するだけですが、まだルートの名前空間を削除できません。たとえば、カスタムフォーマッタを使用してxmlを手動で作成すると、あなたのソリューションが役に立ちます。 – Michael