2012-01-04 8 views
2

私はWCFと戻り値の型に常に不満を抱いてきました。 私は現在、SQLからデータを読み取り、取得されたデータの量に基づいて特定のタイプの新しいオブジェクトを作成し、オブジェクト値にSQLから取得したデータを割り当てるメソッドを開発中です。ストリームまたはストリングを返すWCF?

JSONとXMLにシリアライズする機能があります。 理想的には、シリアル化されたオブジェクトを文字列に変換して、変換された形式でブラウザからの応答を読み取ることができるようにしたいと考えています。

​​:次のようになり

私は私のオブジェクトをシリアル化するときから取得し、ストリームを返す利点は、フォーマットが完全であるということであり、それはクラスで私のDataMembersを使用しているので、レスポンスはJSONでします

しかし、ブラウザでデータを取得するときに、ストリームファイルを保存するかどうかを確認するメッセージが表示されます。この結果を見るにはメモ帳でストリームを開きます。結果がブラウザ上で文字列として表示されないので、これは理想的ではありません。

私は、文字列を返す場合、私はデータを取得し、しかしそれはシリアル化からDataMembersまたは利点のいずれかを使用して、適切にフォーマットされていない情報は、したがって、意味のあるきれいな裸とではありません。

"3151" 

として、この例では、それぞれ2つの変数の2つのSQLフィールドを取得しています。そして、結果をストリームに追加する方法は、最後の結果(5,1)が返されている瞬間と同じように、私は確信しています。

私は私が達成したいものです何かのURLを貼り付けることができるかどうかはわからないが、ここではそれがとにかくです:http://api.justin.tv/api/user/show/justin.json

私の即時の思考はにするXMLWriterまたはいくつかの種類を使用することです手作業で情報を書きますが、シリアライゼーションとDataMemberの機能には配当を支払うことができます。

マイリターンストリームコード:

foreach (MatchProposal proposal in Proposals) 
{ 
    returnStream = WriteJSON(SerializeToJSON(proposal)); 
} 

public MemoryStream SerializeToJSON(object serializeObject) 
{ 
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(serializeObject.GetType()); 
    MemoryStream memoryStream = new MemoryStream(); 
    serializer.WriteObject(memoryStream, serializeObject); 
    return memoryStream; 
} 

public Stream WriteJSON(MemoryStream memoryStream) 
{ 
    string json = Encoding.Default.GetString(memoryStream.ToArray()); 
    return new System.IO.MemoryStream(ASCIIEncoding.Default.GetBytes(json)); 
} 

そして、私の満たされていない単純な文字列を返すコード:

WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json; 

それは単にSQLのデータが返されます。

これまで行ってきたことと、与えられた例で何を達成したいと思っているのかについて十分な情報を与えて欲しいと思います。 短く私はJustin.tv APIに書かれていることを達成したいと思いますが、シリアライゼーションを利用したいと思いますが、ブラウザでリターンストリームを参照すると、私はできるファイルダウンロードで迎えますメモ帳で開くのが理想的ではありません。何かアドバイスのため

おかげで私はいくつかの点で失われた、または私は実装することができます任意の解像度:)

よろしく、 ロナルド

+1

レスポンスにContentTypeを適用していますか? 'text/xml'、または' text/json'ですか? –

+0

@MatthewAbbottいいえいいえ、コンテンツタイプが宣言されていません。これは理想的なストリームを返すために必要ですか? – Rodney

+0

これは問題の可能性が高いと思います。オブジェクトの代わりに 'Stream'を返すので、私はコンテンツタイプが指定されていないと思うので、ブラウザはそれをどのように処理するのか分かりません。これはダウンロードメッセージを表示します。 'text/json'のコンテンツタイプを追加して、問題がソートされているかどうか確認してください。次に、どのコンテンツタイプが要求されているかを確認し、それに合わせてサービスを調整します。 –

答えて

5

あなたは、例えば、応答にContentTypeをを適用している得ているように見える場合text/xml、またはtext/json

これは問題の可能性が高いと思います。オブジェクトの代わりにストリームを返すので、コンテンツタイプが指定されていないと思うので、ブラウザはそれを処理する方法を知らないため、ダウンロードメッセージが表示されます。コンテンツタイプをtext/jsonに追加して、問題のソートを確認してください。次に、どのコンテンツタイプが要求されているかを確認し、それに合わせてサービスを調整します。

更新については、ストリームに2番目のオブジェクトを追加するという点では、ストリームの最後まで貼り付けることをお勧めします。代わりに、サービスからシリアライズして戻すオブジェクトを表す2つのプロパティを含む複合モデルを作成してみませんか?

+0

ありがとう、これは私が探していたものです。 – Rodney

関連する問題