8

contentType = "application/x-www-form-urlencoded; charset=utf-8" の場合、jQuery を使用して Web サービスを呼び出すことができます。

ただし、これは xml を返します。<string>[myjson]</string>

「application/json; charset=utf-8」を使用してサービスに POST しようとすると、StackTrace と ExceptionType が空の 500 エラーが発生します。私の Web サービス関数は決してヒットしないので、この状況をデバッグする方法がよくわかりません。

私のメソッドとクラスは適切な属性で装飾されており、JSON を応答タイプとして使用するように設定されています (wsdl ファイルと disco ファイルと同様)。Ajax 拡張機能がインストールされており、web.config に必要なエントリがあります。

これは SharePoint ファーム上にありますが、それほど大きな違いがあるかどうかはわかりません。すべての WFE に web.config の変更を展開し、ajax 拡張機能をインストールしました。ここでもサービスは機能しますが、デフォルトのコンテンツ タイプ以外は受け入れません。

ここで何が欠けているのかわからない、仲間...

私のajax呼び出し:

$.ajax({
type: "POST",
url: "/_vti_bin/calendar.asmx/Test",
dataType: "json",
data: "{}",
contentType: "application/json; charset=UTF-8",
success: function(msg){
    alert(msg);
    },
error: function(xhr, msg){ alert(msg + '\n' + xhr.responseText); }
});

私のWebサービスクラス:

[WebService(Namespace = "http://namespace")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService()]
public class CalendarService : WebService
{
    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string Test()
    {
        return "Hello World";
    }
}
4

7 に答える 7

3

私はこれを 2.0 で Web サービスを使用して動作させていますが、.d から保護しています (以下の dataFilter を参照)。また、オブジェクトの配列を返しています。注: オブジェクトのクラスは静的です。または、少なくとも私にとっては正しく機能しません。

  $.ajax({
        type: "POST",
        contentType: "application/json; charset=utf-8",
        data: "{}",
        dataFilter: function(data)
        {
            var msg;
            if (typeof (JSON) !== 'undefined' &&
                typeof (JSON.parse) === 'function')
                msg = JSON.parse(data);
            else
                msg = eval('(' + data + ')');
            if (msg.hasOwnProperty('d'))
                return msg.d;
            else
                return msg;
        },
        url: "webservice/ModifierCodesService.asmx/GetModifierList",
        success: function(msg)
        {
            LoadModifiers(msg);
        },
        failure: function(msg)
        {
            $("#Result").text("Modifiers did not load");
        }
    });

これが私のWebサービスのスニペットです:

...

[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class ModifierCodesService : System.Web.Services.WebService
{

     /// <summary>
    /// Get a list of Modifiers
    /// </summary>
    /// <returns></returns>
    [WebMethod(EnableSession = true)]
    public Modifier[] GetModifierList()
    {
        return GetModifiers();
    }
       /// <summary>
        /// Modifiers list from database
        /// </summary>
        /// <returns></returns>
        private Modifier[] GetModifiers()
        {
            List<Modifier> modifier = new List<Modifier>();
            ModifierCollection matchingModifiers = ModifierList.GetModifierList();
            foreach (Modifier ModifierRow in matchingModifiers)
            {
                modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description));
            }
            return modifier.ToArray();
        }
    }

...

オブジェクトコード:

 public static class ModifierList
    {

        /// <summary>
        /// Returns the Modifier Collection.
        /// </summary>
        /// <param name="prefix"></param>
        /// <returns></returns>
        public static ModifierCollection GetModifierList()
        {
于 2009-09-29T19:44:21.020 に答える
1

私は今日、iPhoneアプリが.NetWebサービスと通信することでこれと戦ってきました。

コンテンツタイプをapplication/jsonrequestに変更すると、問題なく処理され、Webサーバーでデータを処理できることがわかりました。

にやにや笑いのために、上記の行をweb.configに追加しましたが、application/jsonが機能しませんでした。

于 2010-07-29T00:36:24.443 に答える
0

これが単純かどうかはわかりませんが、jQuery を使用して Web メソッドから JSON をコールバックしています。

私が見る主な違いは、クラスの属性です

[System.Web.Script.Services.ScriptService]

    [WebService(Namespace = "http://MyNameSpace")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.Web.Script.Services.ScriptService]
    public class Web : System.Web.Services.WebService{

       [WebMethod]
       public string TestMethod(){
         return "Testing";
       }

    }

JSON Web メソッドを公開する唯一の方法であるため、3.5 フレームワークを使用していると想定する必要があります。

jQuery からの私の呼び出しは実質的に同じに見えるので、問題はありません。

于 2009-05-23T06:04:17.143 に答える
0

WebInvoke または WebGet 属性を探していると思います。たとえば、Uri テンプレート、本文スタイル、要求および応答形式を指定できます。

[WebGet(ResponseFormat= WebMessageFormat.Json)]

このリンクが役立つ場合があります。WebInvoke にも同様の記事があります (主に投稿に使用されます)。

于 2009-06-11T18:04:21.837 に答える
0

これを IE でテストしている場合は、contentType 属性から charset 宣言を削除してみてください (つまり、次のようになります。

contentType: "application/json",

charset=UTF-8理由はまだわかりませんが、" " 部分を使用して JSON 呼び出しを行うと、IE はひねりを加えているようです。

代替テキスト

于 2009-05-29T09:55:41.990 に答える
0

私は、ASMX Web サービスへの JQuery AJAX JSON 呼び出しをかなり使用しています。すべてのブラウザで完全に機能します。ASP.NET AJAX Extensions がインストールされた .NET 2.0 を使用しています (3.5 にバンドルされています)。

私のクラスには、あなたと同じデコレータがあります。[WebMethod(EnableSession = true)]私のメソッドにはデコレータしかありません。ただし、私の web.config には、httpHandlers セクションに次のエントリがあります。

<add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />

私のjquery呼び出しは次のようになります:

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "path/to/service/jsonservice.asmx/MethodName",
    data: JSON.stringify(DTO),
    dataType: "json",
    success: function(rtrn) { alert("good"); },
    error: function(req, msg, err) { alert("bad"); }
});

この記事は私の知識の根源です。

于 2009-06-17T14:09:52.420 に答える
-1

scriptMethod タグの応答形式として json を指定する必要があるようです。これは vb.net からのものですが、きっとお分かりいただけると思います。

ResponseFormat:=ResponseFormat.Json

于 2009-05-25T18:28:34.153 に答える