如何在.NET Web API中设置模型绑定?

时间:2012-11-28 12:37:35

标签: .net asp.net-web-api

我很难让Web API使用XML。看起来它应该适用于XML,但许多初学者教程只将int和string传递给一个非常简单的模型。

我能够从HttpWebRequest中提取XML,但我想尝试将XML绑定到模型。不过,我对如何使用XML进行发布感到困惑。

每次我将XML(任何XML,我只是在尝试)发布到我的ApiController方法时,我为XML创建的模型对象为null。所以,我认为有些东西没有连线。我不确定是否必须在Global.asax.cs文件中添加一个条目,或者我是否需要帮助类或什么。

有人能指出我正确的方向吗? (请不要“只使用JSON”建议。我也想做JSON,但我也想知道如何使XML工作。)

谢谢!

1 个答案:

答案 0 :(得分:1)

最简单的方法是对您的对象执行简单的获取,以获取要发送回的XML的示例。

要记住的事情:

  1. 包含名称空间xmlns:i="http://www.w3.org/2001/XMLSchema-instance",这是指示空值
  2. 所必需的
  3. 如果使用标准XML序列化程序配置,则需要命名空间,例如xmlns="http://schemas.datacontract.org/2004/07/MvcApplication10.Controllers"
  4. 在进行get设置时,将接受标头设置为accept: application/xml
  5. 发布到控制器时设置内容类型。 content-type: application/xml
  6. 使用示例对象和控制器。

    public class Foo
    {
        public string Bar { get; set; }
    }
    
    public class FoosController : ApiController
    {
        // GET api/foos
        public Foo Get()
        {
            return new Foo { Bar = "Test" }; 
        }
    
        // GET api/foos
        public Foo Post(Foo test)
        {
            return test;
        }
    }
    

    我在/ api / foos上做一个GET并得到一个示例对象:

    User-Agent: Fiddler
    Host: localhost
    accept: application/xml
    

    响应:

    <Foo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MvcApplication10.Controllers"><Bar>Testing</Bar></Foo>
    

    要发回来,我只需将内容类型标题设置为xml中的值并将其发回:

    User-Agent: Fiddler
    Host: localhost:61280
    content-type: application/xml
    Content-Length: 167
    

    请求

    <Foo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MvcApplication10.Controllers"><Bar>Testing Response</Bar></Foo
    

    回复

    <Foo xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MvcApplication10.Controllers"><Bar>Testing Response</Bar></Foo>
    

    <强>更新

    对于复杂的XML模型,您需要开始使用DataContract注释http://msdn.microsoft.com/en-us/library/ms731045.aspx

    示例:

    [DataContract(Name = "Person")]
    public class Foo
    {
        [DataMember(Name = "Address", IsRequired = False)]
        public string Bar { get; set; }
    }
    

    这改变了所需的XML

    <Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/MvcApplication10.Controllers"><Address>Testing Response</Address></Person>
    

    对于收藏品等,请查看此处http://msdn.microsoft.com/en-us/library/aa347850.aspx