Использование JQuery и JSON для использования асинхронных веб-методов на стороне сервера Asp.net - PullRequest
3 голосов
/ 27 января 2011

Я определил два вызова веб-сервисов в ASP.NET: 1.BeginLengthyProcedure и EndLengthyProcedure (асинхронный веб-метод) 2.LengthProcedureSync

namespace ServiceDemo
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[System.Web.Script.Services.ScriptService]
public class AsyncWebService : System.Web.Services.WebService
{
    public delegate string LengthyProcedureAsyncStub(int milliseconds);

    public string LengthyProcedure(int milliseconds)
    {
        System.Threading.Thread.Sleep(milliseconds);
        return "SuccessAsync";
    }

    public class MyState
    {
        public object previousState;
        public LengthyProcedureAsyncStub asyncStub;
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public IAsyncResult BeginLengthyProcedure(int milliseconds, AsyncCallback cb, object s)
    {
        LengthyProcedureAsyncStub stub = new LengthyProcedureAsyncStub(LengthyProcedure);
        MyState ms = new MyState();
        ms.previousState = s;
        ms.asyncStub = stub;
        return stub.BeginInvoke(milliseconds, cb, ms);
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string EndLengthyProcedure(IAsyncResult call)
    {
        MyState ms = (MyState)call.AsyncState;
        string res = ms.asyncStub.EndInvoke(call);
        return res;
    }

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string LengthyProcedureSync(int milliseconds)
    {
        System.Threading.Thread.Sleep(milliseconds);
        return "SuccessSync";
    }
}
}

Затем я использовал их с помощью JQuery, я не хочу использовать ASP.NET AJAX. LengthProcedureSync работал нормально, но LenghtyProcudure не работал. Я что-то пропустил?

<script type="text/javascript" src="jquery-1.4.4.min.js"></script>

<script type="text/javascript">
    function testJson() {
        $.ajax({
            type: "POST",
            //Didn't work
            url: "AsyncWebService.asmx/LengthyProcedure",
            //Work
            //url: "AsyncWebService.asmx/LengthyProcedureSync",
            data: "{'milliseconds':'2000'}",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (msg) {
                $("#jsonResponse").html(msg.d);
            },
            error: function (msg) {

            }

        });
    };

</script>

Ответы [ 2 ]

1 голос
/ 13 августа 2011

К сожалению, обработчик веб-службы ASP.NET AJAX .NET Framework (который используется для JSON) не обеспечивает поддержку асинхронных вызовов веб-службы, в отличие от обработчика веб-службы ASP.NET по умолчанию.Существует превосходная книга «Создание портала Web 2.0 с ASP.NET 3.5», написанная Омаром А.Л. Забиром, в которой описывается обходной путь для этого недостатка обработчика веб-службы ASP.NET AJAX (см. Главу 7, стр. 177).Существует также пример главы, доступной на MSDN .Надеюсь, это поможет!

0 голосов
/ 27 января 2011

изменить это

public string LengthyProcedure(int milliseconds)
     {
         System.Threading.Thread.Sleep(milliseconds);
         return "SuccessAsync";
     } 

на это:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string LengthyProcedure(int milliseconds)
     {
           System.Threading.Thread.Sleep(milliseconds);         
           return "SuccessAsync";
     } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...