2

我从这里得到了一些关于 servicestack 的很好的解决方案,现在我在两步之间,我已经选择了其中之一。请按照以下方式理解我的实际情况

我使用 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);

现在我有 2 个选项,如下所示

1) 需要将 XSD 转换为类并使用该对象的对象来传递 post 请求,正如我提出的问题我如何将 XSD 文件转换为 C# 类 但我无法使用 XSD.exe 实用程序直接使用 URL 生成类

2)手动传递json字符串如果我有json字符串,那么它看起来像下面

[{1:"22", 2:"123", 3:"60", ..... }] 

(其中 1 用于 id,2 用于 applicationid .. 只是缩短 json 字符串)然后我需要将其转换为 C# 类以在 post 请求中传递对象,但我仍然需要找到与 (1, 2 . .)

第二个选项有点令人困惑,但如果我可以这样做,那么我的客户要求在发布请求中手动传递 json 字符串。

请帮助我选择更好的选项,因为在简单的 Rest WCF 中,我们不需要使用类(模型)引用来发出发布请求。

如果它没有意义,那么我可以更详细地澄清它

提前致谢

4

2 回答 2

3

不知道为什么您无法从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 或 C# XSD.exe 生成的服务模型而不是发送 JSON 来调用 ServiceStack Web 服务,请使用 URL QueryString 进行GET请求或发送标准 HTTP POST 键值对,即application/x-www-用于HTTP POST请求的form-urlencoded 。Request DTO 会自动填充在 QueryString 或 POST'ed FORM 数据上发送的任何变量。

一个常见的标准是使用curlwget来展示如何与您的 REST Web 服务进行通信,因为它的功能和用户能够轻松地使用他们最喜欢的 HTTP 客户端模拟 Web 服务请求。

curl -d "id=1&appliationId=2" http://example.com/myserviceurl/perfmon

有关此示例,请参阅Google 的 Weather API 。否则,您可以像 twitter 那样记录您的 REST api ,并仅向它们显示带有示例输出的 GET Query String 或 POST 表单数据示例。

于 2011-11-05T08:23:08.560 回答
0

1> 在您的情况下,如果您使用 XSD 创建一个类并且它将在您的应用程序中动态使用,那么在这种情况下您将无法使用它,因为您将无法获得应该在您的应用程序中映射的属性应用。2> 我认为唯一的解决方案是在您的应用程序中使用带有服务引用的 WCF。在你的情况下,如果你去

使用服务堆栈:

最主要的是服务堆栈“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 agent exe 中的 perfmon 类的引用(COPY)。现在让我们假设我们按照您的建议制作了一个 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键值转换为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 WITH SERVICE REFERENCE 或者省略 JSON 并将对象从 exe 传递到服务堆栈,如下所示(EXE 中需要的类的副本)

JsonServiceClient client = new JsonServiceClient("myserviceurl");
        RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
        var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);
于 2011-11-05T08:29:06.007 回答