web-dev-qa-db-ja.com

クラス定義に[ScriptService]属性を持つWebサービスのみを解決する方法は、スクリプトから呼び出すことができます

Jquery AJAX call method in webservice。を使用すると、エンティティデータモデルから生成されたwebservice return POCOクラスをJSONとして使用しようとしました。クラス定義はスクリプトから呼び出すことができます。」

これが私のコードです:

namespace CarCareCenter.Web.Admin.Services
{
    /// <summary>
    /// Summary description for About
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class About : System.Web.Services.WebService
    {
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        [WebMethod]
        public static Entities.Category getAbout()
        {
            Entities.Category about = new Entities.Category();
            using (var context = new CarCareCenterDataEntities())
            {
                about = (from c in context.Categories where c.Type == "About" select c).SingleOrDefault();
            }

            return about;
        }
    }
}

aspxページ:

<script type="text/javascript">
        $(document).ready(function () {
            $.ajax({
                type: 'POST',
                dataType: 'json',
                contentType: 'application/json; charset=utf-8',
                url: '/Services/About.asmx/getAbout',
                data: '{}',
                success: function (response) {
                    var aboutContent = response.d;
                    alert(aboutContent);
                    $('#title-en').val(aboutContent.Name);
                    $('#title-vn').val(aboutContent.NameVn);
                    $('#content-en').val(aboutContent.Description);
                    $('#content-vn').val(aboutContent.DescriptionVn);
                    $('#id').val(aboutContent.CategoryId);
                },
                failure: function (message) {
                    alert(message);
                },
                error: function (result) {
                    alert(result);
                }
            });



            $('#SaveChange').bind('click', function () { updateAbout(); return false; });
            $('#Reset').bind('click', function () { getAbout(); return false; })
        });

        function updateAbout() {
            var abt = {
                "CategoryId": $('#id').val(),
                "Name": $('#title-en').val(),
                "NameVn": $('#title-vn').val(),
                "Description": $('#content-en').val(),
                "DescriptionVn": $('#content-vn').val()
            };
            $.ajax({
                type: "POST",
                url: "AboutManagement.aspx/updateAbout",
                data: JSON.stringify(abt),
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    var aboutContent = response.d;
                    $('#title-en').val(aboutContent.Name);
                    $('#title-vn').val(aboutContent.NameVn);
                    $('#content-en').val(aboutContent.Description);
                    $('#content-vn').val(aboutContent.DescriptionVn);
                },
                failure: function (message) {
                    alert(message);
                },
                error: function (result) {
                    alert(result);
                }
            });
        }
    </script>

それを解決するためのアプローチはありますか?私を助けてください 。ありがとう

20
NevenHuynh

属性クラスを追加するだけ[ScriptService]

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
52

古い質問。私は同じ問題があり、ajax呼び出しからcontenttypeを削除しただけで機能しました。

5
MLS

私はちょうどこれと同じエラーメッセージを受け取りました:「クラス定義に[ScriptService]属性を持つWebサービスのみがスクリプトから呼び出すことができます。」しかし、完全に異なる原因と解決策がありました。

開発マシンで動作していましたが、本番環境では動作していませんでした。

私のweb.configで:

<system.web>
  <httpHandlers>
    <remove verb="*" path="*.asmx"></remove>
    <add verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35"></add>
  </httpHandlers>
</system.web>

Addタグを新しいアセンブリバージョンに置き換えました。

<add verb="*" path="*.asmx" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

そしてそれはうまくいった!どうやら古いアセンブリ(1.0.61025.0)は、新しい(3.5.0.0)アセンブリに対してコンパイルされた属性を認識していませんでした。

私がこの人の底に到達するのに必要な時間を誰かが救えることを願っています!

3
Louis Somers

他の誰かが私と同じ愚かな間違いをした場合に備えて、これを追加します。

解決策:Visual Studioのソリューションエクスプローラーで.asmxファイルを右クリックし、[マークアップの表示]を選択します。 Class属性の値が正しく、間違ったクラスを指していないことを確認してください。何らかの理由で、CodeBehindファイルとクラス名の不一致により、より関連性の高い何かではなく、このエラーがスローされます。

バックストーリー:レガシーコードに取り組んでおり、.asmx Webサービスを使用して他のコードベースとの一貫性を維持したいと考えていました。 VS2017では、そのファイルを追加する場所が見つからなかったため、別の.asmxファイルをコピーして名前を変更しました。私はもっ​​とよく知っているべきだった。ソリューションエクスプローラーで.asmxをダブルクリックするとコードビハインドファイルが直接表示されるため、この問題はわずかにマスクされています。ファイルの名前を変更してもClass属性が更新されないことは簡単に見落とされがちです。

0
Gabe

私も同じ問題に直面していました。
私はコードの下でコメントしたところ、機能し始めました:

[System.Web.Script.Services.ScriptService]

.asmxファイルで利用できます。

0