0

この「1時間のクイック」プロジェクトが登場したとき、2日後にStackoverflowでこの質問をすることになるとは思いもしませんでした。しかし、ここで...

現在、JSON を返す WCF REST サービスで GET メソッドを呼び出している外部クライアント アプリケーション (java、perl、php、c#) が多数あります。これは正常に機能しており、期待どおりに実装されています。

これらの同じアプリケーションに対して、JSON を元のサービス インターフェイスの新しいメソッドに POST する必要があります。C# アプリは WebClient を使用し、Perl と PHP は CURL を使用し、Java は私が関与していない魔法を使用しています。これらはすべて JSON を文字列として生成し、基本的な HTTP 機能を呼び出してデータをエンドポイントに POST します。

問題は、使用している JSON に C# クラスが関連付けられていないことです (変更できない理由により)。そのため、文字列と json.net を使用して着信データを解析/処理する予定です。例として、エンドポイントは次のようになります。

https://magic.myserver.com/service/dataaggregator/

外部アプリケーションはこれに JSON 文字列を送信し、基になるコードで必要に応じて解析および処理します。

質問は非常に単純なものです。これをサービス インターフェイスの観点からどのように実装しますか? サービスコード内でJSON文字列のシリアル化/管理を問題なく処理できます。問題は、そもそもそのJSON文字列をサービスコードに取得する方法です。

現時点では、これらは「通常の」WCF REST インターフェイスを使用して行うことはできないと考えています。むしろ、受信した投稿データに直接アクセスできる下位レベルの HTTP リスナーを実装する必要があります。

4

4 に答える 4

1

任意の JSONを受け入れたい場合は、次を参照してください。

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/071f73bb-e141-4a68-ae61-05635382934f

それが望まない場合は、質問で目標を明確にする必要があるかもしれません。

https://stackoverflow.com/a/7360619およびhttps://stackoverflow.com/a/2330219も参照してください。

サービス インターフェイスは次のようになります。

[OperationContract]
public Whatever  MyMethod(DataPacket rawJSON)
{ 
     ....
}

[DataContract]
public class DataPacket
{
  [DataMember]
  public JsonDictionary Registration { get; set; }
}

... JsonDictionary は、この回答に従って定義されています。

次のように、ストリームを受け入れるようにメソッドをコーディングすることもできます。

[OperationContract]
public Whatever  MyMethod(Stream rawJSON)
{ 
     ....
}

...そしてこの回答に従って、JSONを自分で解析します。

于 2012-06-19T20:50:36.540 に答える
0

ASP.NET WebAPI では、匿名および弱い型指定の JSON オブジェクトを使用します

「匿名および弱い型指定の JSON オブジェクト」セクションを参照してください: http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

実際には JSON.NET を使用しているため、古い .NET REST テクノロジで実行できます。しかし、成熟した JSON パーサー (.NET だけでなく) を扱う場合、Json.NET のように任意の JSON 構造を解析できると確信しています。

UPD:このリンクを見てください

http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx

Json.NET の JObject クラスを動的として扱うこともできます。Json 文字列を解析すると JObject を生成できます

于 2012-06-19T20:53:13.350 に答える
0

HttpListener を使用する場合は、サンプル コードを次に示します ( Json.Netを使用) 。

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://*:8080/");
listener.Start();
Task.Factory.StartNew(() =>
{
    while (true)
    {
        HttpListenerContext context = listener.GetContext();
        ThreadPool.QueueUserWorkItem((o) =>
        {
            HttpListenerContext ctx = (HttpListenerContext)o;
            StreamReader rdr = new StreamReader(ctx.Request.InputStream);
            var postData = rdr.ReadToEnd();
            var dynJson = (JObject)JsonConvert.DeserializeObject(postData);

            foreach (var ch in dynJson.Children())
            {
                Console.WriteLine(ch);
            }

        }, context);
    }
});

Thread.Sleep(1000);
WebClient web = new WebClient();
web.UploadString("http://localhost:8080", 
                  JsonConvert.SerializeObject(new { ID=1,Name="name1" } ));
于 2012-06-19T21:11:39.473 に答える
0

.Net 4.0 WCF プロジェクトの場合、JSON が直接サポートされます。

http://msdn.microsoft.com/en-us/library/ee354381.aspx

「メッセージ形式の選択」セクションを見つけます。Acceptヘッダーがapplication/jsonに設定されていることを確認してください

于 2012-06-19T21:18:09.377 に答える