2014-10-16 4 views
0

У меня есть два проекта, которые запускаются на разных серверах, но оба имеют ссылку на общую DLL, которая содержит сложный тип LeadVM. LeadVM содержит под-объекты, такие как Employer, который содержит свойства. Пример:Пропустить сложный объект через http

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

Таким образом, проект 1 может создать объект типа LeadVM и заполнить его. Мне нужно затем, используя HTTP-вызов, POST в данных контроллеру/действию во втором проекте. Второй проект знает, что такое объект LeadVM.

Как я могу сериализовать (?) LeadVM и передать его принимающему действию во втором проекте?

EDIT: Благодаря @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.

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 посланный, как это и мой объект NewCustomer в проекте 2 уже заполненный, готовый к использованию.

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

Я уверен, что делаю вещи очень неловко. Я почищу его, но хочу опубликовать ответ, к которому меня привели.

+0

Да, сериализация - правильное слово для этого –

ответ

2

Json, вероятно, самый распространенный вариант, есть хорошая библиотека JSON для C#, который можно найти здесь:

http://james.newtonking.com/json

В качестве альтернативы, так как вы просто делаете НТТР пост и у вас есть только один объект , самым быстрым вариантом было бы просто выписать данные по строкам и обработать машину получателя. Поскольку они оба знают, что такое LeadVM, и оба, по-видимому, имеют одно и то же определение, было бы тривиально читать текстовую строку в правильные переменные. Это быстро становится более медленным вариантом, если вы решите добавить к этому процессу больше типов объектов.

+0

Да, я опубликовал несколько свойств. Реальный объект LeadVM имеет несколько под-объектов, и каждый из них обладает многими свойствами. Было бы утомительно делать их 1 к 1. Спасибо за ответ. Я пошел вперед и использовал материал Newtonsoft JSON. У меня есть несколько проблем, но я спрошу их в другом вопросе. Спасибо за предложение. –

+0

На самом деле, ваше предложение привело меня ко всему коду, который мне нужен, чтобы сделать это. Я обновил свой вопрос с помощью последнего кода, который я использовал. Не стесняйтесь комментировать или редактировать его, пожалуйста! :) –

Смежные вопросы