13

私は2つのコントローラを持つセルフホストWeb APIを持っています:

  • コントローラー 1 には、デフォルトの DataContractSerializer が必要です (EF 5 POCO を公開しています)
  • コントローラー 2 の場合、パラメーター UseXmlSerializer を true に設定した XmlFormatter が必要です (XmlDocument を公開しています)。

コントローラーの初期化中にフォーマッターを設定しようとしましたが、構成はグローバルのようで、すべてのコントローラーに影響します。

public class CustomConfigAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings settings,
    HttpControllerDescriptor descriptor)
    {
        settings.Formatters.XmlFormatter.UseXmlSerializer = true;

    }
}

どうすればこれを解決できますか?

4

5 に答える 5

10

あなたは非常に正しい軌道に乗っていました。ただし、構成属性での新しいインスタンスを初期化する必要がありXmlMediaTypeFormatterます。そうしないと、グローバル参照に影響します。

ご存じのとおり、IControllerConfigurationインターフェイスに基づいて 2 つの属性を作成する必要があります。

public class Controller1ConfigAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings controllerSettings,
                           HttpControllerDescriptor controllerDescriptor)
    {
        var xmlFormater = new XmlMediaTypeFormatter {UseXmlSerializer = true};

        controllerSettings.Formatters.Clear();
        controllerSettings.Formatters.Add(xmlFormater);
    }
}

public class Controller2ConfigAttribute : Attribute, IControllerConfiguration
{
    public void Initialize(HttpControllerSettings controllerSettings,
                           HttpControllerDescriptor controllerDescriptor)
    {
        var xmlFormater = new XmlMediaTypeFormatter();
        controllerSettings.Formatters.Clear();
        controllerSettings.Formatters.Add(xmlFormater);
    }
}

次に、関連する属性でコントローラーを装飾します

[Controller1ConfigAttribute]
public class Controller1Controller : ApiController
{

[Controller2ConfigAttribute]
public class Controller2Controller : ApiController
{
于 2012-11-15T08:52:10.013 に答える
1

構成:

config.Formatters.Remove(config.Formatters.JsonFormatter);
config.Formatters.Insert(0, new CustomXmlMediaTypeFormatter());

カスタム フォーマッタ:

public class CustomXmlMediaTypeFormatter : XmlMediaTypeFormatter
{
    public CustomXmlMediaTypeFormatter()
    {
        UseXmlSerializer = true;
    }
}

これうまくいくようですが、それほどエレガントではありません。デフォルトの Xml Formatter を削除しても機能しないため、フレームワークがまだ何らかの形でそれを使用していると結論付けました。

于 2012-11-14T18:13:49.243 に答える
0

コントローラーのアクション自体は、データがどのようにシリアル化されるかを気にする必要はありません。データを要求できる必要があり、データを取得する操作に必要な形式は同じです。

デフォルトでは、Web API は json オブジェクトにシリアル化されます。ただし、リクエストのコンテンツ タイプを xml に設定すると、同じ結果が返されますが、json ではなく xml としてフォーマットされます。

于 2012-11-14T17:08:53.173 に答える
0

カスタムを書くことができると思いますActionFilterAttribute

OnActionExecuting元の値を HttpContext に格納し、次に でOnActionExecuted元の値を復元します。

于 2012-11-14T16:53:59.710 に答える