我已经使用WCF和Rest-toolkit在.Net的新REST服务中成功添加并使用了Get操作。该服务定义如下:
[OperationContract]
[WebGet(UriTemplate = "/{id}")]
Foo GetFooById(string id);
我从客户端这样称呼它:
public Foo GetFoo(string id)
{
var httpClient = new HttpClient("http://127.0.0.1:8000/");
var response = httpClient.Get("foo/" + id);
return response.Content.ReadAsDataContract<Foo>();
}
现在我想添加一个POST动作,但是你如何定义它,以及如何映射参数?
答案 0 :(得分:3)
要POST参数,需要使用DataContractSerializer对其进行序列化。 e.g,
在服务器上:
[OperationContract]
[WebInvoke(Method="POST",UriTemplate = "/foos")]
void PostFoo(Foo foo) {}
在客户端:
var foo = new Foo();
var content = HttpContentExtensions.CreateDataContract<Foo>(foo);
var client = new HttpClient("http://example.org/service.svc/foos");
client.Post(content)
请注意,在创建此代码时不涉及编译器,买家要小心。
答案 1 :(得分:2)
您需要WebInvoke
属性而不是WebGet
:
[OperationContract]
[[WebInvoke(Method = "POST", UriTemplate = "/{id}")]
Foo PutFooById(string id, Foo foo)
请注意,“POST”实际上是默认方法,因此如果您愿意,可以省略它。
答案 2 :(得分:0)
我相信你用XML包装它。这里讨论(答案提供):
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/00c93f9f-f1f3-4f08-9927-db0e4ed91d2d
您还需要将请求Content-Type指定为application / xml。这就是你如何传递自定义类(这些类的XML表示)。
使用WebInvoke属性定义它,与您使用WebGet的方式非常相似。但是,WebInvoke不使用您在WebGet中使用的URL占位符。