使用servicestack使用REST WCF的更好选择是什么

时间:2011-11-05 06:43:23

标签: wcf servicestack

我从这里得到了一些关于servicestack的好解决方案,现在我介于两步之间,我选择其中一个。请按照以下

了解我的实际情况

我使用Servicestack创建了一个REST WCF,一个Model(类)如下所示

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 ..只是缩短json字符串)然后我需要将其转换为C#类以在post请求中传递对象,仍然需要找到映射方式(1 ,2 ..)

第二个选项有点令人困惑但是如果我可以使用它那么我的客户端要求在post请求中手动传递json字符串。

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

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

提前致谢

2 个答案:

答案 0 :(得分: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键值对,即 HTTP POST 请求的 application / x-www-form-urlencoded 。 Request DTO会自动填充在QueryString或POST'ed FORM数据上发送的任何变量。

通用标准是使用 curl wget 来展示如何与REST Web服务进行通信,因为其功能和用户可以轻松地模拟Web服务请求与他们最喜欢的HTTP客户端。

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

有关此示例,请参阅Google's Weather API。否则,您只需记录您的REST apis like twitter does,并向他们展示带有示例输出的GET查询字符串或POST表单数据示例。

答案 1 :(得分:0)

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

使用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 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代表可用内存等。 但是,如果我们使用这种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传递到服务堆栈,如下所示(EXE中需要类的复制)

JsonServiceClient client = new JsonServiceClient("myserviceurl");
        RESTWCF.ServiceModel.Perfmon p = new RESTWCF.ServiceModel.Perfmon();
        var res = client.Post<RESTWCF.ServiceModel.Perfmon>("/perfmon", p);
相关问题