1

ajaxリクエストからの着信URLをGlobal.asaxのWebサービスメソッドにマップしようとしています。Webサービスはこのパス/ajax/BookWebService.asmxにあり、2つのメソッドGetListOfBookとがありGetListOfAuthorます。

Scriptタグでurl:/ajax/book/listの代わりにurl :を使用したい。/ajax/BookWebService.asmx/GetListOfBook

これが私のスクリプトとマークアップです:

<script type="text/javascript">

  $(function () {
      $("#btnCall").click(function () {

          $.ajax({type: "POST",
              url: "/ajax/book/list",
              data: "{}",
               contentType: "application/json; charset=utf-8",
               dataType: "json",
              success: function (response) {
                  var list = response.d;
                      $('#callResult').html(list);
              },
              error: function (msg) {
                  alert("Oops, something went wrong");
              }
          });

      });
  });

</script>

<div>
  <div id="callResult"></div>
  <input id="btnCall" type="button" value="Call Ajax" />
</div>

これがGlobal.asaxです:

void Application_BeginRequest(object sender, EventArgs e)
{
    var currentRequest = HttpContext.Current.Request.Url.AbsolutePath;

    if (currentRequest.Contains("ajax/book/list")) {
        HttpContext.Current.RewritePath("/ajax/BookWebService.asmx/GetListOfBook");
    }

}

FireBugコンソールにチェックインすると、これが表示されます。

"NetworkError:500 Internal Server Error-localhost:13750 / ajax / book /list"

url:/ajax/book/listurl:/ajax/BookWebService.asmx/GetListOfBookに変更すると、期待どおりに機能します。

VS2010と.NET4を使用しています。

/ajax/book/list代わりにajax呼び出しを行うにはどうすればよい/ajax/BookWebService.asmx/GetListOfBookですか?

4

1 に答える 1

2

ajax 呼び出しをタイプ「GET」に変更できる場合は、次の変更を試してください。

Ajax 呼び出し:

    $(function () {
        $("#btnCall").click(function () {

            $.ajax({ type: "GET",  //Change 1
                url: "/ajax/book/list",
                data: "{}",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (response) {
                    var list = response.d;
                    $('#callResult').html(list);
                },
                error: function (msg) {
                    alert("Oops, something went wrong");
                }
            });

        });
    });

</script>

Global.asax:

    void Application_BeginRequest(object sender, EventArgs e)
    {
        var currentRequest = HttpContext.Current.Request.Url.AbsolutePath;
        //Change 2
        if (currentRequest.Contains("ajax/book/")) // maybe you can use a generic path to all rewrites...
        {
            IgnoreWebServiceCall(HttpContext.Current);
            return;
        }
    }
    //Change 3
    private void IgnoreWebServiceCall(HttpContext context)
    {
        string svcPath = "/ajax/BookWebService.asmx";

        var currentRequest = HttpContext.Current.Request.Url.AbsolutePath;

        //You can use a switch or....
        if (currentRequest.Contains("ajax/book/list"))
        {
            svcPath += "/list";
        }

        int dotasmx = svcPath.IndexOf(".asmx");
        string path = svcPath.Substring(0, dotasmx + 5);
        string pathInfo = svcPath.Substring(dotasmx + 5);
        context.RewritePath(path, pathInfo, context.Request.Url.Query);
    }

BookWebService.asmx:

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [ScriptService] ///******************* Important
    public class BookWebService : System.Web.Services.WebService
    {

        [WebMethod]

        [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)] ///******************* Important
        public string list()
        {
          return "Hi";

        }

     }

私のために働きます:)

于 2012-10-02T00:54:10.780 に答える