2013-02-25 98 views
3

在这里,我从我的Web应用程序调用Restful WCF服务,我不知道如何传递一个对象作为参数。这里是我的客户端代码:如何在HttpWebRequest POST中传递一个对象作为参数?

protected void Button1_Click(object sender, EventArgs e) 
{ 
    UserInputParameters stdObj = new UserInputParameters 
    { 
     AssociateRefId = "323", 
     CpecialLoginId = "[email protected]", 
     PartnerId = "aaaa", 
     FirstName = "aaaa", 
     LastName = "bbbb", 
     Comments = "dsada", 
     CreatedDate = "2013-02-25 15:25:47.077", 
     Token = "asdadsadasd" 
    }; 

    string url = "http://localhost:13384/LinkService.svc/TokenInsertion"; 

    try 
    { 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     System.Net.WebRequest webReq = System.Net.WebRequest.Create(url); 
     webReq.Method = "POST"; 
     webReq.ContentType = "application/json; charset=utf-8"; 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(stdObj.GetType()); 
     StreamWriter writer = new StreamWriter(webReq.GetRequestStream()); 
     writer.Close(); 
     webReq.Headers.Add("URL", "http://localhost:13381/IntegrationCheck/Default.aspx"); 
     System.Net.WebResponse webResp = webReq.GetResponse(); 
     System.IO.StreamReader sr = new System.IO.StreamReader(webResp.GetResponseStream()); 
     string s = sr.ReadToEnd().Trim(); 
    } 
    catch (Exception ex) 
    { 
    } 
} 

我的服务方法:

public string UserdetailInsertion(UserInputParameters userInput) 
+0

转换你stdObj使用JSON.NET或任何其他LIB成JSON,写在你的poststream(在这种情况下,作家) – 1Mayur 2013-02-25 12:25:08

回答

8

你必须解析对象的格式,并将其写入到RequestStream。

你的类

[Serializable] 
class UserInputParameters { 
    "your properties etc" 
}; 

的代码序列化对象

private void SendData(UserInputParameters stdObj) { 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(stdObj.GetType()); 
    StreamWriter writer = new StreamWriter(webReq.GetRequestStream()); 
    JavaScriptSerializer jss = new JavaScriptSerializer(); 

    // string yourdata = jss.Deserialize<UserInputParameters>(stdObj); 
    string yourdata = jss.Serialize(stdObj); 
    writer.Write(yourdata); 
    writer.Close(); 
} 

这应该是的伎俩。

JavaScriptSerializer位于命名空间System.Web.Script.Serialization可在装配System.Web.Extensions (in System.Web.Extensions.dll)在这里找到的是MSDN文章:http://msdn.microsoft.com/en-us/library/bb337131.aspx

+0

我是否必须通过像这样writer.Write(stdObj); ??? – Rooney 2013-02-25 11:48:59

+0

你必须通过JSON字符串;) – Knerd 2013-02-25 11:51:59

+0

你可以编辑你的代码,并告诉我如何通过JSON字符串? – Rooney 2013-02-25 12:02:56

0

我们不能将对象数据从服务器端代码使用WebRequest类发送到远程服务器在C#中,因为我们只能将流数据发送到远程服务器,并且内存中的对象表示形式不是流。因此,在发送对象之前,我们需要将其序列化为流,然后我们可以将它发送到远程服务器。完整的代码。

namespace SendData 
    { 
     public class SendObjectData 
     { 
      static void Main(string[] args) 
      { 

       Employee emp = new Employee(); 
       emp.EmpName = "Raju"; 
       emp.Age = 30; 
       emp.Profession = "Teacher"; 

       POST(emp); 
      } 

      // This method post the object data to the specified URL. 
      public static void POST(Employee objEmployee) 
      { 
       //Serialize the object into stream before sending it to the remote server 
       MemoryStream memmoryStream = new MemoryStream(); 
       BinaryFormatter binayformator = new BinaryFormatter(); 
       binayformator.Serialize(memmoryStream, objEmployee); 

       //Cretae a web request where object would be sent 
       WebRequest objWebRequest = WebRequest.Create(@"http://localhost/XMLProvider/XMLProcessorHandler.ashx"); 
       objWebRequest.Method = "POST"; 
       objWebRequest.ContentLength = memmoryStream.Length; 
       // Create a request stream which holds request data 
       Stream reqStream = objWebRequest.GetRequestStream(); 
      //Write the memory stream data into stream object before send it. 
       byte[] buffer = new byte[memmoryStream.Length]; 
       int count = memmoryStream.Read(buffer, 0, buffer.Length); 
       reqStream.Write(buffer, 0, buffer.Length); 

      //Send a request and wait for response. 
       try 
       { 
        WebResponse objResponse = objWebRequest.GetResponse(); 
      //Get a stream from the response. 
        Stream streamdata = objResponse.GetResponseStream(); 
      //read the response using streamreader class as stream is read by reader class. 
        StreamReader strReader = new StreamReader(streamdata); 
        string responseData = strReader.ReadToEnd(); 
       } 
       catch (WebException ex) { 
        throw ex; 
       } 

      } 
     } 
    // This is an object that needs to be sent. 
     [Serializable] 
     public class Employee 
     { 

      public string EmpName { get; set; } 
      public int Age { get; set; } 
      public string Profession { get; set; } 

     } 
    } 
相关问题