我从这里得到了一些关于servicestack的很好的解决方案,现在我在2步之间,我已经选择了其中之一。请理解我的实际场景,如下
我已经使用Servicestack和一个模型(类)创建了一个REST WCF,如下所示
public class Perfmon
{
public long id { get; set; }
public string appliationId { get; set; }
public string cpuUsage { get; set; }
public string availableMemory { get; set; }
.......
.......
} 现在,我想从另一个EXE项目中调用此服务,如下所示
JsonServiceClient client = new JsonServiceClient("myserviceurl");
RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);现在我有两个选项,如下所示
1)我需要将XSD转换为类,并使用它的对象来传递post请求,根据我提出的问题How can i convert XSD file to C# Class,但我不能使用XSD.exe实用程序直接使用URL生成类。
2)手动传递json字符串如果我有json字符串,则如下所示
[{1:"22", 2:"123", 3:"60", ..... }] (其中1代表id,2代表applicationid ..to只是缩短json字符串)然后我需要将它转换为C#类,以便在post请求中传递对象,我仍然需要找到映射(1,2 ..)的方法。
第二种选择有些令人困惑,但如果我可以使用它,那么我的客户要求在post请求中手动传递json字符串。
请帮助我选择更好的选项,因为在简单的Rest WCF中,我们不需要使用class (Model)引用来发出post请求。
如果它没有意义,那么我可以更详细地澄清它
提前感谢
发布于 2011-11-05 16:23:09
不确定为什么您不能从XSD.exe生成模型类-但这实际上并不是必需的。使用ServiceStack的正常方式是将所有ServiceModel类(即DTO)放在一个独立的无依赖程序集中,并将其与一个通用的JSON/JSV/XML/SOAP服务客户端一起使用。
如果您已经让XSD.exe生成了DTO类,那么它只会生成您的ServiceModel.dll的副本程序集。如果你不想给他们提供dll,那么只需要给他们DTO源代码--这基本上就是XSD.exe实用程序生成的代码(只是更干净一些,因为代码生成包含了很多繁琐的东西/样板文件)。
那么,为什么要经历所有额外的代码生成+构建步骤呢?尤其是在生成时遇到问题的情况下。
这两个选项都可以工作,最理想的是提供强类型的DTO并使用通用服务客户机。
如果你想要传递一个JSON字符串,那么你需要使用一个纯的HTTP客户端,例如HttpWebRequest或者新的HttpClient。
在没有C#模型的情况下调用ServiceStack REST Web服务
如果不想使用您的服务DTO或ServiceStack XSD.exe生成的服务模型调用C# web服务,而不是发送JSON,请使用用于GET请求的URL或发送标准HTTP POST键值对,例如,用于HTTP POST请求的application/x-www-form-urlencoded。Request DTO会自动填充在QueryString或POST表单数据上发送的任何变量。
一个常见的标准是使用HTTP 或wget来展示如何与REST web服务通信,因为它的功能和用户可以很容易地使用他们最喜欢的HTTP来模拟web服务请求。
curl -d "id=1&appliationId=2" http://example.com/myserviceurl/perfmon有关这方面的示例,请参阅Google's Weather API。否则,您可以只记录REST apis like twitter does,并向它们显示GET查询字符串或POST表单数据示例以及示例输出。
发布于 2011-11-05 16:29:06
如果您使用1>创建一个类,并且如果它将在您的应用程序中动态使用,那么您将无法使用它,因为您将无法获得您应该在您的应用程序中映射的它的属性。我认为唯一的解决方案是在你的应用程序中使用带有服务引用的2>。在你的情况下,如果你选择
使用SERVICESTACK的:
主要的事情是服务堆栈“POST”响应。当我们将“POST”发送到服务栈时,它只接受DTO请求。
JsonServiceClient client = new JsonServiceClient("myserviceurl");
RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);上面的约束。这是我们需要在控制台应用程序中执行的代码。当我们发送POST请求时,它需要“perfmon”类的对象。
让我们考虑一下,我们在控制台应用程序中有perfmon类。然后我们不需要使用JSON字符串,因为如果我们创建JSON字符串,那么我们还必须将属性分配给类,以便可以将其插入到服务堆栈末端。(那么为什么要使用JSON)
使用RESTWCF的:
现在让我们假设使用RESTWCF的相同场景,它使用WebRequest接受“GET”和“POST”请求。(正常的RESTWCF)在这种情况下,我们当然不需要Monitor代理exe中的perfmon类的引用(副本)。现在,让我们假设我们按照您的建议创建了一个JSON字符串
WebRequest request = WebRequest.Create(your URL");
request.ContentType = "application/json; charset=utf-8";
request.Method = "POST";
string json = "{\"Id\":1,\"2\":\"100\",\"3\":\"1000\"}";在上面,2代表CPU,3代表availableMemory等等。但是,如果我们使用这种JSON结构,那么它将不会分配属性值(因为JSON Key值转换为C#类属性)我们的Perfmon类应该如下所示。
当然,您的类应该如下所示
[DataContract(Name = "perfmon")]
public class Performance
{
[DataMember(Order = 1)]
public long Id
{
get;
set;
}
[DataMember(Order = 2)]
public string CpuUsage
{
get;
set;
}
[DataMember(Order = 3)]
public string AvailableMemory
{
get;
set;
}
}当然,现在如果我们创建一个像…这样的JSON字符串。
string json = "{\"Id\":1,\"CpuUsage\":\"100\",\"AvailableMemory\":\"1000\"}";
在这种情况下,它可以工作并为类的属性赋值,但在这种情况下,字符串将获得更长的长度?
所以,我猜最终的解决方案是使用带有服务引用的WCF,或者省略JSON并将对象从exe传递到服务堆栈,如下所示(类的副本IN需要在EXE中)
JsonServiceClient client = new JsonServiceClient("myserviceurl");
RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);https://stackoverflow.com/questions/8018640
复制相似问题