私は.Net framework 2.0/jQueryを使用して2.0 WebサービスへのAjax呼び出しを行っています。 ajax呼び出しでcontentTypeをどのように設定しても、サービスは常にXMLを返します。 Jsonを返してほしい!
呼び出しは次のとおりです。
$(document).ready(function() {
$.ajax({
type: "POST",
url: "DonationsService.asmx/GetDate",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
// Hide the fake progress indicator graphic.
$('#RSSContent').removeClass('loading');
// Insert the returned HTML into the <div>.
$('#RSSContent').html(msg.d);
}
});
});
Fiddlerのリクエストヘッダーは次のようになります。
POST /DonationsService.asmx/GetDate HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: en-us
Referer: http://localhost:1238/text.htm
Accept: application/json, text/javascript, */*
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; eMusic DLM/4; .NET CLR 2.0.50727)
Host: localhost:1238
Content-Length: 2
Connection: Keep-Alive
Pragma: no-cache
ContentTypeを「text/json」に設定してみましたが、同じ結果が得られました。
Webサービスメソッドは次のとおりです。
<WebMethod()> _
Public Function GetDate() As String
'just playing around with Newtonsoft.Json
Dim sb As New StringBuilder
Dim sw As New IO.StringWriter(sb)
Dim strOut As String = String.Empty
Using jw As New JsonTextWriter(sw)
With jw
.WriteStartObject()
.WritePropertyName("DateTime")
.WriteValue(DateTime.Now.ToString)
.WriteEndObject()
End With
strOut = sw.ToString
End Using
Return strOut
End Function
そして、これが返すものです:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://DMS.Webservices.org/">{"DateTime":"11/13/2008 6:04:22 PM"}</string>
Jsonを要求したときにWebサービスにJsonを強制的に返す方法を知っている人はいますか?
.Net Framework 3.5またはそのようなものにアップグレードするように言わないでください(私はそんなに愚かではありません)。 2.0ソリューションが必要です。
ASP.NET 2.0のASMXサービスからJSONを返す に問題はありません。 ASP.NET AJAX Extensionsがインストールされている必要があります。
Webサービスに[ScriptService]装飾を必ず追加してください。それが、ASP.NET AJAXフレームワークのサーバー側の部分に、適切に形成されたリクエストに対してJSONを返すよう指示するものです。
また、2.0で使用している場合、私の例では「.d」を「msg.d」から削除する必要があります。 「。d」は3.5に付属するセキュリティ機能です 。
メソッドは文字列を返すと言うので、応答は要素にラップされます。これを使用してプレーンJSONを送信できますが、wsdlはだまされます(関数は無効ですが、データを応答します)。
[WebMethod(Description="return pure JSON")]
public void retrieveByIdToPureJSON( int id )
{
Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) );
}
頑張って、トム
ところで:JsonConvertについてはNewtonsoft.Jsonをご覧ください
Webメソッドを次のように装飾する必要があります。
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
あなたは残りを正しく持っています:)
詳細は Encosia および Andrew Rolandのブログ
編集:以下に記載されているように、これは.NET 3.5のみです(私はこれを知らなかった、私の悪い)。
Jayrockライブラリasp.netのクイックスタート を使用できます。
これにより、httpハンドラを記述してjsonを返すことができます。
<%@ WebHandler Class="JayrockWeb.HelloWorld" %>
namespace JayrockWeb
{
using System;
using System.Web;
using Jayrock.Json;
using Jayrock.JsonRpc;
using Jayrock.JsonRpc.Web;
public class HelloWorld : JsonRpcHandler
{
[ JsonRpcMethod("greetings") ]
public string Greetings()
{
return "Welcome to Jayrock!";
}
}
}
.NET 2.0では、XMLまたはバイナリシリアル化以外には何もできないでしょう。自動生成されたWeb参照を使用していない場合は、ASMXを気にしないでください。代わりにASPXまたはASHXを使用してください。
Reflectionを使用して、独自のクイックJSONコンバーターを作成することもできます。
Dim sb As New StringBuilder("{")
For Each p As PropertyInfo In myObject.GetType().GetProperties()
sb.Append(String.Format("""{0}"":""{1}"",", p.Name, p.GetValue(myObject,
Nothing).ToString()))
Next p
//remove the last "," because it's uneeded.
sb.Remove(sb.Length - 1, 1)
sb.Append("}")
私はこれについて100%正確ではないかもしれませんが、.net WebサービスはXML/SOAPベースであると確信しています。
Webサービスのデフォルトの動作をオーバーライドする必要があります。これが可能になるかどうかは完全にはわかりません。
これが最も有用な答えではないことは承知していますが、正しい方向に向かうかもしれません。