スポンサードリンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサードリンク



スポンサードリンク

ジェネリックハンドラでJSONを返す

JSONで値を返すWebServiceを、ちゃちゃっとVisualStudio2008で作成しようとしたが結構、大変だった。

.Net Framework4.5辺りだと、JSON用のライブラリもあるみたいだが、今回は3.5で実装する必要がある。

最初は普通にWebServiceを作成するためにasmxを新規で作った。

このままだとPOSTかSOAPしか受け付けないのでweb.configに以下を追加してGETリクエストも送れるようにした。
<system.web>
<webServices>
<protocols>
<add name="HttpGet"/>
</protocols>
</webServices>
</system.web>

そしてJSONで戻す為に、返り値はDataContractJsonSerializerを使ってシリアライズする。

できたら、こんな感じで実行!
http://localhost:59313/WebService1.asmx/HelloWorld?userId=001&userName=taka

結果:
<?xml version="1.0" encoding="UTF-8"?>
<string xmlns="http://tempuri.org/">{"ResultRow":150,"ResultStatus":10,"ResultSuccess":"True"}</string>

何故か、XMLにラップされたJSONになってしまった・・・・(>_<)

違うぞ・・・・純粋にJSONだけで返したいんだ!

どうやら、ContentTypeがapplication/jsonにしないとだめらしい。

しかしasmxで作成した場合、どこで変えるんだ?

しばし(30分くらい)悪戦苦闘するも、さっぱりわからん!

---------------------------------------------------------------------

潔く諦めてジェネリックハンドラashxを使うことにした。

これならContentTypeを指定できる。

で作成してみて、実行! こんな感じでgetリクエストを送る。

http://localhost:59313/Handler1.ashx?userId=001&userName=taka

結果:
{"ResultRow":150,"ResultStatus":10,"ResultSuccess":"True"}

やった成功!!


★参照の追加
System.Runtime.Serialization
System.ServiceModel.Web.dll

★ソース
using System;
using System.Collections.Generic;
using System.Linq;

using System.Web;
using System.Web.Services;

using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.IO;
using System.Web.Script.Services;

namespace WSkintai
{
///
/// $codebehindclassname$ の概要の説明です
///


public class Handler1 : IHttpHandler
{
//[WebService(Namespace = "http://tempuri.org/")]
//[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public void ProcessRequest(HttpContext context)
{
//Getで送られたクエリストリングを取得する場合
string userId = context.Request.Params.Get("userId").ToString();
string userName = context.Request.Params.Get("userName").ToString();

context.Response.ContentType = "application/json";

//DataContractJsonSerializerをインスタンス化
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(UpdateResult));

//変換する.NETオブジェクトを作成
UpdateResult result = new UpdateResult()
{
ResultSuccess = "True",
ResultRow = 150,
ResultStatus = 10
};

//JSONデータを書き込むためのMemoryStreamを作成
MemoryStream stream = new MemoryStream();

//.NETオブジェクトをJSONデータに変換
serializer.WriteObject(stream, result);

//MemoryStreamの内容を出力
stream.Position = 0;
StreamReader reader = new StreamReader(stream);

context.Response.Write(reader.ReadToEnd());

}

public bool IsReusable
{
get
{
return false;
}
}


}

[DataContract]
public class UpdateResult
{
[DataMember]
public string ResultSuccess { get; set; }
[DataMember]
public int ResultRow { get; set; }
[DataMember]
public int ResultStatus { get; set; }
}

}

スポンサードリンク


コメントの投稿

非公開コメント

メールフォーム

ShoEngineer

Author:ShoEngineer

人気ブログランキングへ
↑↑クリックお願いします!

相互リンク歓迎(^_^)
以下からご連絡を!

名前:
メール:
本文:

スポンサード リンク
楽天
検索フォーム
Lc.ツリーカテゴリー
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。