web-dev-qa-db-ja.com

2.0 asmx WebサービスからJSONを返す方法

私は.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ソリューションが必要です。

27
camainc

ASP.NET 2.0のASMXサービスからJSONを返す に問題はありません。 ASP.NET AJAX Extensionsがインストールされている必要があります。

Webサービスに[ScriptService]装飾を必ず追加してください。それが、ASP.NET AJAXフレームワークのサーバー側の部分に、適切に形成されたリクエストに対してJSONを返すよう指示するものです。

また、2.0で使用している場合、私の例では「.d」を「msg.d」から削除する必要があります。 「。d」は3.5に付属するセキュリティ機能です

35
Dave Ward

メソッドは文字列を返すと言うので、応答は要素にラップされます。これを使用してプレーンJSONを送信できますが、wsdlはだまされます(関数は無効ですが、データを応答します)。

[WebMethod(Description="return pure JSON")]
public void retrieveByIdToPureJSON( int id )
{
  Context.Response.Write( JsonConvert.SerializeObject( mydbtable.getById(id) );
}

頑張って、トム

ところで:JsonConvertについてはNewtonsoft.Jsonをご覧ください

12
Tom

Webメソッドを次のように装飾する必要があります。

[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

あなたは残りを正しく持っています:)

詳細は Encosia および Andrew Rolandのブログ

編集:以下に記載されているように、これは.NET 3.5のみです(私はこれを知らなかった、私の悪い)。

10
Darko Z

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!";
        }
    }
}
2
redsquare

.NET 2.0では、XMLまたはバイナリシリアル化以外には何もできないでしょう。自動生成されたWeb参照を使用していない場合は、ASMXを気にしないでください。代わりにASPXまたはASHXを使用してください。

2
Mark Cidade

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("}")    
1
Seth

私はこれについて100%正確ではないかもしれませんが、.net WebサービスはXML/SOAPベースであると確信しています。

Webサービスのデフォルトの動作をオーバーライドする必要があります。これが可能になるかどうかは完全にはわかりません。

これが最も有用な答えではないことは承知していますが、正しい方向に向かうかもしれません。

0
Jon P