Публикация междоменного JSON в ASP.NET с помощью jQuery - PullRequest
3 голосов
/ 07 января 2010

Есть какая-то хитрая проблема.

Я работаю над проектом, в котором нам нужно разрешить распечатку квитанции, когда пользователи проверяют наш сайт в киоске. По причинам, связанным с драйверами и форматированием, я использую автоматизацию COM с Word для распечатки квитанций. Я поместил этот код в веб-сервис, работающий на локальной машине.

План состоял в том, чтобы поместить простой jQuery-вызов ajax на странице html в URL-адрес локальной машины, на которой запущен веб-сервис. Этот ajax-вызов содержит объект порядка json, который десериализуется веб-службой и распечатывается. Работает нормально, если я использую localhost, однако в производственной среде я не буду использовать правило междоменных вызовов ajax.

Прокси-сервер не будет работать, поскольку код, запущенный на веб-сайте, не может связаться с локальной веб-службой, на которой запущена служба печати. Покопавшись в Интернете, я обнаружил, что использование JSONP может быть решением этой проблемы, но я не могу понять, как заставить его работать. В большинстве уроков предполагается, что вы пытаетесь получить некоторые удаленные данные, а не просто публикуете данные. Веб-служба печати возвращает void.

Как настроить мой веб-сервис (asmx) для работы с JSONP и как будет выглядеть мой код jQuery? В настоящее время это выглядит примерно так:

function printReceipt(data) {
   $.ajax({
       type: "POST",
       url: "http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson",
       data: data,
       dataType: "json",
       contentType: "application/json; charset=utf-8",
       error: function(xhr, msg) { alert(xhr.statusText); }
    });
}

Любые более простые альтернативы JSONP или любые другие возможные решения, которые я, возможно, не рассматривал, также были бы полезны.

1 Ответ

8 голосов
/ 07 января 2010

JSONP просто добавляет тег script в раздел head и поэтому ограничивается только запросами GET. Чтобы настроить ваш веб-сервис asmx для обработки JSONP, вам нужно будет выполнить сериализацию вручную:

[WebMethod]
[ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]
public string Foo()
{
    var json = new JavaScriptSerializer().Serialize(new 
    {
        Prop1 = "some property",
    });
    string jsoncallback = HttpContext.Current.Request["jsoncallback"];
    return string.Format("{0}({1})", jsoncallback, json);
}

И на стороне клиента:

$.getJSON("http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson?jsoncallback=?",
    function(data) {
        alert(data);
    });

Другой альтернативой для междоменных вызовов AJAX является использование Flash .

...