在.Net中使用POST

时间:2010-06-30 12:30:32

标签: .net wcf rest post

我已经使用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动作,但是你如何定义它,以及如何映射参数?

3 个答案:

答案 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占位符。