如何在客户端设置请求正文

时间:2012-02-29 04:55:04

标签: c# wcf http rest

假设我使用C#和.NET有以下Web方法:

[WebInvoke(UriTemplage="/users", Method="POST")]
[OperationContract]
public User AddNewUser(User u);

当您实现POST Web方法时,您将接受请求正文作为传入HTTP请求消息的一部分。期望从传入的HTTP消息体中反序列化参数u。

我的问题是:我们如何在客户端设置此请求主体?它必须设置在某个地方。这真让我困惑。

此外,如果我将“ResponseFormat = WebMessageFormat.Json”添加到WebInvoke,如何将返回的json字符串反序列化为User对象?

感谢。

2 个答案:

答案 0 :(得分:1)

您的问题没有透露您尝试过的内容。如果您在客户端上使用.net,则可以使用DataContractSerializer来获取序列化数据。

然后,您可以使用 HttpWebRequest ,方法设置为 POST 。 将序列化数据添加到Web请求并使用GetResponse()方法。

或者,您可以使用Fiddlr使用您创建的请求来测试您的Web服务。它简明扼要地显示了服务器的确切内容。

答案 1 :(得分:0)

对WCF Rest方法执行POST请求:

    private string UseHttpWebApproach<T>(string serviceUrl, string resourceUrl, string method, T requestBody)
    {
            string responseMessage = null;                
            var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
            if (request != null)
            {
                request.ContentType = "application/json";
                request.Method = method;
            }

            if(method == "POST" && requestBody != null)
            {                   
                byte[] requestBodyBytes = ToByteArrayUsingJsonContractSer(requestBody);                
                request.ContentLength = requestBodyBytes.Length;
                using (Stream postStream = request.GetRequestStream())
                    postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
            }

            if (request != null)
            {
                var response = request.GetResponse() as HttpWebResponse;
                if(response.StatusCode == HttpStatusCode.OK)
                {
                    Stream responseStream = response.GetResponseStream();
                    if (responseStream != null)
                    {
                        var reader = new StreamReader(responseStream);

                        responseMessage = reader.ReadToEnd();
                    }
                }
                else
                {
                    responseMessage = response.StatusDescription;
                }
            }
            return responseMessage;
    }

    private static byte[] ToByteArrayUsingJsonContractSer<T> (T requestBody)
    {
        byte[] bytes = null;
        var serializer1 = new DataContractJsonSerializer(typeof(T));
        var ms1 = new MemoryStream();
        serializer1.WriteObject(ms1, requestBody);
        ms1.Position = 0;
        var reader = new StreamReader(ms1);
        bytes = ms1.ToArray();
        return bytes;
    }

现在假设您的User对象如下所示:

Public Class User
{
    Public int UserId  {get;set;}
    Public string UserName {get;set;}
    Public string Password  {get;set;}
}

要调用上面的方法:

User objUser = new objUser();
objUser.Username = "Test";
objUser.Password = "Test";
UseHttpWebApproach<User>(serviceBaseUrl, "users", "POST", objUser);