2

ここからservicestackについていくつかの良い解決策を得ました.今、私は2つのステップの間にあり、そのうちの1つを選択しました. 以下のように私の実際のシナリオを理解してください

Servicestack を使用して 1 つの REST WCF を作成しました。1 つのモデル (クラス) は次のとおりです。

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をクラスに変換し、そのオブジェクトを使用してポストリクエストに渡す必要があり ます.XSDファイルをC#クラスに変換するにはどうすればよいですか

2) json 文字列を手動で渡す json 文字列がある場合は、以下のようになります

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

(1 は id、2 は applicationid です。json 文字列を短縮するため) 次に、ポスト リクエストでオブジェクトを渡すために C# クラスに変換する必要がありますが、(1, 2 でマップする方法を見つける必要があります。 .)

2番目のオプションはやや混乱しますが、それを使用できる場合、ポストリクエストでjson文字列を手動で渡すことがクライアントの要件です。

シンプルなRest WCFでは、ポストリクエストを行うためにクラス(モデル)参照を使用する必要がないため、より良いオプションを選択するのを手伝ってください。

意味がわからない場合は、より詳細に説明できます

前もって感謝します

4

2 に答える 2

3

XSD.exeから Model クラスを生成できなかった理由がわかりませんが、実際には必要ありません。ServiceStack を使用する通常の方法は、すべての ServiceModel クラス (つまり DTO) を個別の依存関係のないアセンブリに配置し、それを Generic JSON/JSV/XML/SOAP サービス クライアントの 1 つと共に使用することです。

XSD.exe で DTO クラスを生成した場合は、単に ServiceModel.dll のレプリカ アセンブリを生成しただけです。dll を配布したくない場合は、DTO ソース コードを提供してください。これは、基本的に XSD.exe ユーティリティが生成するものです (code-gen には多くのクラフト/ボイラープレートが含まれているため、クリーンなだけです)。

では、余分なコード生成とビルドの手順をすべて実行する必要はありません。特に生成に問題がある場合。

どちらのオプションも機能します。最も理想的なのは、厳密に型指定された DTO を提供し、汎用サービス クライアントを使用することです。

代わりに JSON 文字列を渡したい場合は、純粋な HTTP クライアント (例: HttpWebRequestまたは新しいHttpClient ) を使用する必要があります。

C# モデルを使用しない ServiceStack REST Web サービスの呼び出し

JSON を送信する代わりに、サービス DTO または C# XSD.exe によって生成されたサービス モデルを使用して ServiceStack Web サービスを呼び出したくない場合は、GET要求に URL QueryString を使用するか、標準の HTTP POST キー値のペア、つまりapplication/x-www- を送信します。 HTTP POSTリクエスト用の form-urlencoded 。Request DTO には、QueryString または POST された FORM データで送信されるすべての変数が自動的に取り込まれます。

一般的な標準は、curlまたはwgetを使用して REST Web サービスと通信する方法を示すことです。これは、その機能とユーザーが好みの HTTP クライアントで Web サービス要求を簡単にエミュレートできるためです。

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

この例については、Google の Weather APIを参照してください。それ以外の場合は、 Twitter のように REST API を文書化し、GET クエリ文字列または 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);

上記の for を制約します。これは、コンソール アプリケーションで実行する必要があるコードです。POST リクエストを送信するときに「perfmon」クラスのオブジェクトが必要です。

コンソール アプリケーションに perfmon クラスがあるとします。次に、JSON 文字列を使用する必要はありません。JSON 文字列を作成する場合は、サービス スタックの最後に挿入できるように、クラスにプロパティを割り当てる必要があるためです。(なぜJSONを使いたいのか)

RESTWCF の使用:

WebRequest を使用して「GET」、「POST」リクエストを受け入れる RESTWCF を使用して、同じシナリオを想定してみましょう。(通常の RESTWCF) この場合、もちろん Monitor エージェント 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 を使用するか、JSON を省略して、以下のように exe からオブジェクトをサービス スタックに渡すことだと思います (COPY OF CLASS IN REQUIRE IN 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 に答える