将控制台应用程序中的Json格式数据传输到Service Stack。

5 浏览
0 Comments

将控制台应用程序中的Json格式数据传输到Service Stack。

我发现你是唯一一个回答有关Service Stack的人,我没有你的电子邮件,无论你为我提供了什么上次的问题,看起来都很好。我看过你的个人资料,你是mythZ的主要创始人,所以我觉得可以再次向你提问。对于我的一个问题,向Service Stack以JSON格式传递POST数据,我感谢你的回答。你的回答是正确的,但在我的情况下,我遇到了以下问题。让我详细描述一下。我看过Service Stack的"Hello World"示例。我得到了一个链接:https://github.com/ServiceStack/ServiceStack.Extras/blob/master/doc/UsageExamples/UsingRestAndJson.cs。在我的情况下,我有一个调用Service Stack的控制台应用程序(它将数据插入数据库)。现在,在这个控制台应用程序中,我已经创建了一个类(class1),它在Service Stack中有相同的属性。我在我的控制台应用程序中为该类的属性赋值,并将整个对象POST到Service Stack。语法如下:

JsonServiceClient client = new JsonServiceClient(myURL);
MYclass cls= MakeObjectForServiceStackToInsertData();
var res = client.Post("/postrequest", cls);

我已经使用了上述的POST方法,似乎是可以的。在Service Stack的OnPOST事件中,我获取到这些数据并插入到数据库中。对我来说一切都正常工作。现在我的客户希望我们以任何格式传递数据。JSON/XML。我知道这是可能的,因为你给我提供了一个"Hello World"示例的链接,上面有提到。但我发现他们使用ajax/JQuery来向服务端发送数据。在我的情况下,这是一个控制台应用程序,所以我不能使用ajax/JQuery。我想知道,在我的情况下,是否可以以JSON格式传递数据并进行操作。非常感谢您的帮助。

0
0 Comments

问题出现的原因是想要将非类型化和自由文本的JSON或XML发送到ServiceStack,但无法使用ServiceStack的通用类型化C#客户端(例如JsonServiceClient,XmlServiceClient等)。相反,只需使用任何基本的Http客户端,如.NET提供的HttpWebRequest。

为了解决这个问题,可以使用下面的示例代码来调用ServiceStack的Hello World示例web服务:

发送自由文本JSON:

const string RemoteUrl = "http://www.servicestack.net/ServiceStack.Hello/servicestack/hello";

var httpReq = (HttpWebRequest)WebRequest.Create(RemoteUrl);

httpReq.Method = "POST";

httpReq.ContentType = httpReq.Accept = "application/json";

using (var stream = httpReq.GetRequestStream())

using (var sw = new StreamWriter(stream))

{

sw.Write("{\"Name\":\"World!\"}");

}

using (var response = httpReq.GetResponse())

using (var stream = response.GetResponseStream())

using (var reader = new StreamReader(stream))

{

Assert.That(reader.ReadToEnd(), Is.EqualTo("{\"Result\":\"Hello, World!\"}"));

}

发送自由文本XML:

var httpReq = (HttpWebRequest)WebRequest.Create(RemoteUrl);

httpReq.Method = "POST";

httpReq.ContentType = httpReq.Accept = "application/xml";

using (var stream = httpReq.GetRequestStream())

using (var sw = new StreamWriter(stream))

{

sw.Write("<Hello xmlns=\"http://schemas.servicestack.net/types\"><Name>World!</Name></Hello>");

}

using (var response = httpReq.GetResponse())

using (var stream = response.GetResponseStream())

using (var reader = new StreamReader(stream))

{

Assert.That(reader.ReadToEnd(), Is.EqualTo("<HelloResponse xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"http://schemas.servicestack.net/types\"><Result>Hello, World!</Result></HelloResponse>"));

}

推荐使用HTTP流量分析工具来查看与您的web服务之间发送和接收的HTTP流量。一些很好的HTTP流量分析工具包括:

- Fiddler

- 浏览器中的网络检查工具(如Chrome,Safari,Firefox和IE)

- WireShark

最后,建议在控制台应用程序中使用HTTPWebRequest来创建JSON字符串并传递给ServiceStack,在那里进行反序列化并执行插入操作。或者,在控制台中创建一个对象并在控制台应用程序中分配属性值,然后将整个对象作为DTO传递给ServiceStack并执行插入操作。

总之,强烈建议在两端使用相同类型的DTO。类型化的API易于编码,可以进行迭代开发和重构。在大多数情况下,只需放置.dll文件,即可获得最新的更改。如果出现问题(例如客户端依赖于已删除的字段),可以在编译时得知,更好。至于序列化程序,建议使用JSON,ServiceStack的JsonSerializer更快,对DTO更具弹性。

0