【问题标题】:WCF Web API - Model Binding to an object (Ensure that a request HttpOperationHandler has an output parameter with a type assignable to...)WCF Web API - 模型绑定到对象(确保请求 HttpOperationHandler 具有可分配给...的类型的输出参数)
【发布时间】:2012-01-04 17:37:08
【问题描述】:

在 WCF Web API Preview 5 上,我正在处理一个奇怪的行为。这是场景:

这是我的模型:

public class Person
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
}

这是 API:

[ServiceContract]
public class PersonApi {

    [WebGet(UriTemplate = "person?id={ID}&name={Name}&surname={Surname}&age={Age}")]
    public Person Get(Person person) {

        return person;
    }

}

我使用以下代码注册了 API:

RouteTable.Routes.MapServiceRoute<ADummy.PersonApi>("Dummy");

当我尝试使用以下 URL 访问服务时,我收到此错误:

localhost:36973/Dummy/person?id=1&name=Tugberk&surname=Ugurlu&age=24


服务操作“Get”永远不会收到输入值 'Person' 类型的参数'person'。确保一个请求 HttpOperationHandler 有一个输出参数,其类型可分配给 '人'。

但是当我像下面这样更改我的 API 逻辑时,它可以工作:

[ServiceContract]
public class PersonApi {

    [WebGet(UriTemplate = "person?id={ID}&name={Name}&surname={Surname}&age={Age}")]
    public Person Get(int ID, string Name, string Surname, int Age) {

        var p = new Person { 
            ID = ID,
            Name = Name,
            Surname = Surname,
            Age = Age
        };

        return p;
    }

}

在 WCF Web API 中,我想事情不像在 ASP.NET MVC 中那样工作。

模型绑定到 WCF Web API 中的对象的方式是什么?

更新

我添加了另一种方法:

[WebInvoke(UriTemplate= "put", Method="POST")]
public Person Put(Person person) {

    return person;
}

当我使用以下详细信息调用此方法时:

方法:POST

网址:http://localhost:36973/Dummy/put

接受:/ 内容类型:text/xml

内容长度:189

身体:

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ID>1</ID>
<Name>Tugberk</Name>
<Surname>Ugurlu</Surname>
<Age>25</Age>
</Person>

我得到了我需要的东西。那么,查询字符串绑定到自定义对象是不允许的吗?

【问题讨论】:

  • 如果将操作从 Get() 更改为 Post(),是否会正确绑定 Person 模型?
  • @counsellorben 查看我的更新。

标签: asp.net-mvc wcf asp.net-mvc-3 wcf-web-api


【解决方案1】:

根据您的经验,设计行为似乎是 Get() 操作只会绑定您的 UriTemplate 中定义的参数。就目的和安全性而言,这是正确的行为。

【讨论】:

  • 但是帖子也没有绑定查询字符串?
  • 很抱歉,目前还不清楚。您是否尝试过传递定义的查询字符串的 POST?如果有,结果如何?
  • 我尝试了同样的错误。如果我使用 json 格式的结构化 xml 发布,它会将输入绑定到一个对象。你似乎没有像我一样对这个问题有足够的了解。所以,我们都在这里根据自己的胆量猜测。
【解决方案2】:

支持最新版本的ASP.NET Web API(随 ASP.NET MVC 4 Beta 发布)模型绑定。

模型绑定和验证:模型绑定提供了一种从 HTTP 请求的各个部分提取数据并将这些消息部分转换为 Web API 操作可以使用的 .NET 对象的简单方法。

对于以前版本的 ASP.NET Web API,可以使用 HttpOperationHandler 实现所需的功能,并在 OnHandle 方法中返回模型。或许Validating model properties WCF Web APi问答可以用来激发灵感。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多