2012-02-29 79 views
0

假设我有以下用C#和.NET Web方法:如何设置请求主体在客户端

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

预计,当你实现Web发布的方法,你会接受一个请求体为部分传入的HTTP请求消息。预计参数u将从传入的HTTP消息体反序列化。

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

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

谢谢。

+0

如果这些答案对您有帮助,请花时间给予答案。 – BentOnCoding 2012-03-01 18:42:29

回答

1

你的问题没有透露你试过的东西。如果您在客户端上使用.net,那么您可以使用DataContractSerializer来获取序列化数据。

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

或者,您可以使用Fiddlr来使用您创建的请求测试您的Web服务。它给你一个关于服务器到底是什么的简明视图。

+0

我确实使用.NET和C#。 – 2012-02-29 05:55:51

0

要执行POST请求到您的WCF休息方法:

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; 
    } 

现在假设你的用户对象,如下所示:

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); 
+0

您的responseMessage是一个字符串。我怎样才能得到一个用户对象?谢谢! – 2012-02-29 18:38:44

+0

您需要使用DataContractSerializer将字符串数据反序列化到您的对象实例中。 – BentOnCoding 2012-02-29 18:40:58

+0

如果请求主体包含某些敏感数据(如用户密码),如何确保安全性? – 2012-02-29 18:51:34

相关问题