2009-10-14 5 views
7

WCFで匿名型を返したいと思います。これは可能ですか?WCFと匿名のタイプ

+0

がどのようにクライアントが知っていますどのようなタイプになりますか? –

+0

タイプなし契約 –

+2

を使用しても、これは_ワールドなことです。誰かがこれを必要とする理由をいくつか紹介します。 1.クライアントはJavascriptでJSONレスポンスを処理することができます。 2.多数の応答タイプを維持しなくても、WCFに「汎用」要求を出すことができます。 これまでのところ、(肯定的な)回答(@ dave-ward)は実際にこれを可能にする設定の詳細が不足しているように見えるのは残念です。 – tishma

答えて

0

いいえ、そうではありません。あなたはあなたのタイプを事前に定義しなければなりません。

+0

OK、わかりました。しかし、この目的のためにMyObj型を定義し、メンバのIsRequired = falseをマークした場合、メンバの一部だけでMyObjのインスタンス全体を送信するにはどうすればよいですか?これは可能ですか? –

+0

Eugene Osovetskyまたはmarc_sの回答を参照してください。いずれかのルートがあなたを助けます。私はmarc_sの答えはおそらくあなたの問題のためのあなたの最高の1つだと思います。 – Randolpho

3

から匿名のタイプを返すことはできません。の方法はありますか?だから、なぜあなたはWCFからそれを返すことができるでしょうか?

+0

私はこのdownvoteを理解していません - ジョンは絶対に正しいですが、匿名型はどの.NETメソッドからも返すことができません。なぜ100%の回答のためのdownvote ...... –

+0

まったく。匿名型を「オブジェクト」として返すことができます。これは、Web APIとJSONシリアライザでうまくいきます。 –

+0

この質問は一般的なWCFに関するものであり、Web APIに関するものではありません。また、JSON形式にはフィールド名が含まれています。それは、JavaScriptのために直列化および非直列化を正常に行うことができます。しかし、文字列値 "20"を直列化しようとすると、文字列または整数として逆直列化されます。 Javascriptでは問題ありませんが、C#で問題になる可能性があります。どのように「うまく動作するか」を定義する方法に注意してください。 –

4

匿名の型は使用できませんが、WCFと型なしメッセージについてはおそらく話していますか?

WCFには、Messageタイプのパラメータ(場合によっては同じ型の戻り値)を定義するオプションがあります。これは、WCFに行く生のメッセージです(それから戻ってきます)。

私はそこに多くの良い情報を見つけることができません - MSDNに関するいくつかのドキュメントがありますが、私がこれまで見てきた最高のものはKurt Claeysのブログ投稿WCF : Untyped messages on WCF operationsです。

このアプローチを使用することはお勧めできません.WCFがメッセージの内容を直接処理するのはもっと面倒な作業ですが、WCFが私たちを救済しようとしていることですが、もしあなたが本当にメッセージのすべてのビットを微調整しなければならない - これは行く方法のようです。

マルク・

+0

おそらくカスタムメッセージがこのメッセージのために行く方法です。 +1 – Randolpho

1

OK、私は理解しています。しかし、 タイプMyObjをこの目的のために定義し、 メンバーのIsRequired = falseを指定すると、 メンバーの一部のみでMyObjの インスタンスを経由して+ sendを送信できますか?これは可能ですか?

あなたは間違いなく、匿名型を返すことができ[DataMember(EmitDefaultValue=false)]

0

を見てみましょう。これは、例えば、動作します:

public object GetLatestPost() 
{ 
    XDocument feedXML = XDocument.Load("http://feeds.encosia.com/Encosia"); 

    var posts = from feed in feedXML.Descendants("item") 
        select new 
        { 
        Title = feed.Element("title").Value, 
        Link = feed.Element("link").Value, 
        Description = feed.Element("description").Value 
        }; 

    return posts.First(); 
} 

あなたがASMX ScriptServiceのWebMethod属性として、そのメソッドを呼び出した場合、あなたはそれからこのJSONを取得します:

{"d": 
    {"Title":"Using an iPhone with the Visual Studio development server", 
    "Link":"http://feeds.encosia.com/~r/Encosia/~3/vQoxmC6lOYk/", 
    "Description":" Developing iPhone-optimized portions of an ASP.NET ..."}} 

あなたが返すようにIEnumerableをの戻り値の型を使用することができます匿名型のコレクション。

+4

.NET 4 WCFでこれを動作させることはできません。それでもハッキングを続けようとしています。 – vlad259

+0

ここに成功しましたか?私は応答の代わりに504のエラーを取得し続けます。 – tishma

1

パラメータのないコンストラクタに関するいくつかの不満のためにXMLシリアライザではできないようですが、Dave Wardの指示に従ってajaxクライアントにサービスしている場合はjsonシリアライザで動作します。

0

ExpandoObjectを使用できます。あなたはDTOでプロパティを定義するときExpandoObjectように、クライアントは、辞書のように生成されます。

契約DTO

public class TaskDTO 
{ 
    public string Type { get; set; } 
    public ExpandoObject Args { get; set; } 
    public string Id { get; set; } 
    public TaskDTO SuccessTask { get; set; } 
    public TaskDTO FailTask { get; set; } 
    public bool IsFinal { get; set; } 
} 

クライアント

using (var client = new JobServiceClient()) 
{ 
    var task = new TaskDTO 
    { 
     Id = Guid.NewGuid().ToString(), 
     Type = "SendEmailTask", 
     IsFinal = true 
    }; 
    dynamic args = new ExpandoObject(); 
    args.To = "[email protected]"; 
    args.Title = "test job service"; 
    args.Content = "test job service"; 
    task.Args = ((IDictionary<string, object>)args).ToDictionary(i => i.Key, i => i.Value); 
    client.Execute(task); 
} 

がサービス

dynamic args = dto.Args; 
関連する問題