通过http传递复杂对象

时间:2014-10-16 04:28:21

标签: c# asp.net-mvc

我有两个在不同服务器上运行的项目,但它们都引用了一个包含称为LeadVM的复杂类型的公共dll。 LeadVM包含子对象,如Employer,其中包含属性。例如:

LeadVM.FirstName
LeadVM.LastName
LeadVM.Employer.Name
LeadVM.Employer.Phone

因此,项目1可以创建LeadVM类型的对象,并填充它。然后,我需要通过HTTP调用将数据中的POST发送到第二个项目中的控制器/操作。第二个项目知道LeadVM对象是什么。

如何...序列化(?)LeadVM并将其传递给第二个项目中的接受行动?

编辑:感谢@Unicorno Marley,我最终使用了Newtonsoft JSON的东西。

现在我只是在项目1中创建我的对象,然后执行以下代码(我确定它很笨重但是有效)。

LeadVM NewCustomer = new LeadVM();
NewCustomer.set stuff here....

var js = Newtonsoft.Json.JsonSerializer.Create();
var tx = new StringWriter();
js.Serialize(tx, NewCustomer);
string leadJSON = tx.ToString();

然后我可以使用HttpWebRequest向我的项目2发送Web请求。

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1234/Lead/Create");
request.Method = "POST";
StreamWriter streamOut = new StreamWriter(request.GetRequestStream(), System.Text.Encoding.ASCII);
streamOut.Write(System.Web.HttpUtility.UrlEncode(leadJSON));
streamOut.Close();
HttpWebResponse resp = null;
resp = (HttpWebResponse)request.GetResponse();
StreamReader responseReader = new StreamReader(resp.GetResponseStream(), Encoding.UTF8);
sResponse = responseReader.ReadToEnd();
resp.Close();

在项目2中,我可以捕获这样发送的json,并且项目2中的NewCustomer对象已经填充,可以使用。

var buffer = new byte[Request.InputStream.Length]; 
Request.InputStream.Read(buffer, 0, buffer.Length);
string json = System.Text.Encoding.Default.GetString(buffer);
json = System.Web.HttpUtility.UrlDecode(json);
LeadVM NewCustomer = Newtonsoft.Json.JsonConvert.DeserializeObject<PhoenixLead.LeadVM>(json);

我确信我做得很尴尬。我会把它清理干净,但是想发布我所带来的答案。

1 个答案:

答案 0 :(得分:2)

Json可能是最常见的选项,c#中有一个很好的json库可以在这里找到:

http://james.newtonking.com/json

或者,由于您只是在做一个HTTP帖子并且您只有一个对象,因此最快的选择就是逐行写出数据并让收件人机器解析它。由于他们都知道LeadVM是什么,并且两者都可能具有相同的定义,因此将文本字符串读入适当的变量将是微不足道的。如果您决定在此过程中添加更多对象类型,这将很快成为较慢的选项。