Используйте jQuery для получения одного значения из другого домена - PullRequest
1 голос
/ 22 апреля 2010

Я делаю какую-то работу для благотворительной организации, которая занимается сбором средств. Всякий раз, когда кто-то вносит залог, его сумма залога записывается в SQL Server. Они хотели бы, чтобы сумма обещания была опубликована на нескольких других веб-сайтах, поэтому я подумал: «А-ха! Это подходящее время для изучения веб-сервисов!» Я предполагал, что смогу настроить веб-сервис, который возвращает сумму залога в виде строки, а затем выгрузить некоторый код jquery на внешние сайты, которые будут вызывать веб-сервис.

Прошло около девяти часов, и я все еще пытаюсь выяснить это. Похоже, что JSONP - это единственный способ выполнять междоменные запросы, но даже после просмотра множества учебников я не уверен, как заставить мою страницу .NET возвращать правильное значение, и теперь мне интересно, есть ли не лучший способ сделать это в целом. Кто-нибудь может предоставить полностью упрощенный пример кода?

TL; DR: мне нужно вернуть одно значение для нескольких страниц, используя jquery или javascript с другого веб-сервера.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2010

Вот ваш «полностью упрощенный пример кода»:

Ваш WebMethod (поместите его в коде example.aspx позади файла):

[WebMethod(CacheDuration = 0, EnableSession = true)]
public static YourResultType YourMethodName(string param1,int param2)
{
    YourResultType result=new YourResultType();
    result.x1=true;
    result.x2="The Response can be in any type";
return result;
}

Ваш тип результата:

public class YourResultType
{
  public YourResultType(){}
  public bool x1;
  public string x2;
}

Коды JavaScript (на основе jQuery):

$.ajax({
    type: "POST", cache: false,
    url: "example.aspx/YourMethodName",
    data: "{'randomparam':'" + ((new Date()).getTime()) + 
    //randomparam is for preventing cache
    "','param1':'param1Value','param2':'param2Value'}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        if (msg.hasOwnProperty("d")) msg = msg.d;
        //And Here, The msg parameter, 
        //contains the result of the WebMethod 
        //and you can use that like this:
        alert(msg.x1);      
        alert(msg.x2);
    }
});
0 голосов
/ 22 апреля 2010

JSONP - это путь. Суть в том, что вы предоставляете имя функции для использования в качестве обратного вызова в строке запроса, сериализуете возвращенные данные в виде JSON, а затем заключаете сериализованные данные (строку) в вызов функции. jQuery получит это обратно внутри тега скрипта, чтобы вызвать функцию обратного вызова с данными JSON.

Вот немного кода, адаптированного из одного из моих проектов ASP.NET MVC. Учитывая объект для сериализации и параметр обратного вызова, он вернет строку, которую можно отправить обратно в качестве содержимого. В моем классе он на самом деле возвращает ContentResult, но я изменил его, чтобы он возвращал простую строку.

public class JsonPSerializer
{
    private string Callback { get; set; }

    public JsonPSerializer(string callback)
    {
        this.Callback = callback;
    }

    private static string GetJson<T>(T obj)
    {
        using (MemoryStream stream = new MemoryStream())
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            serializer.WriteObject(stream, obj);

            return Encoding.UTF8.GetString(stream.GetBuffer().TakeWhile( b => b != '\0')).ToArray());
        }
    }

    public string Serialize<T>(List<T> list) where T : IModel
    {

        StringBuilder builder = new StringBuilder();
        builder.AppendFormat("{0}([", Callback);
        foreach (var obj in list)
        {
            builder.Append(GetJson(obj));
            builder.Append(",");
        }
        return builder.ToString().TrimEnd(',') + "])";
    }

    public string Serialize<T>(T obj) where T : IModel
    {
        string content = GetJson(obj);
        return  Callback + "(" + content + ")";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...