Как сделать вывод файла ASMX JSON


Я создал файл ASMX с кодом позади файла. Он работает нормально, но он выводит XML.

однако мне нужно, чтобы он выводил JSON. Конфигурация ResponseFormat, похоже, не работает. Мой код-это:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    {
        return new string[] { "abc", "def" };
    }
}
6   60   2008-10-17 11:50:36

6 ответов:

с WebService возвращает XML, даже если ResponseFormat установлен в JSON:

убедитесь, что запрос является запросом POST, а не GET. Скотт Гатри имеет сообщение, объясняющее, почему.

хотя это написано специально для jQuery, это также может быть полезно для вас:
использование jQuery для потребления ASP.NET JSON Web Services

чтобы получить чистую строку JSON, не будучи завернутым в XML, вы должны написать строку JSON непосредственно в HttpResponse, и WebMethod тип возврата до void.

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }

Это, вероятно, старые новости к настоящему времени, но магия, кажется:

  • [ScriptService] атрибут в классе веб-службы
  • [ScriptMethod (UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] по методу
  • Content-type: application/json in request

С этими частями на месте, запрос GET успешно.

для HTTP POST

  • [ScriptMethod (UseHttpGet = false, ResponseFormat = ResponseFormat.Json)] по методу

и на стороне клиента (предполагая, что ваш webmethod называется MethodName, и он принимает один параметр, называемый searchString):

        $.ajax({
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ searchString: q }),
            success: function (response) {                  
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ": " + jqXHR.responseText);
            }
        });

быстро понял, что я узнал трудный путь (в основном тратя 4 часа на Google), вы можете использовать PageMethods в своем файле ASPX для возврата JSON (с маркером [ScriptMethod ()]) для статического метода, однако если вы решите переместить свои статические методы в файл asmx, это не может быть статический метод.

кроме того, вам нужно сообщить веб-службе Content-Type: application/json, чтобы вернуть JSON из вызова (я использую jQuery и 3 Ошибки, Чтобы Избежать При Использовании jQuery статья была очень поучительной-ее с того же сайта, упомянутого в другом ответе здесь).

вы вызываете веб-службу из клиентского скрипта или на стороне сервера?

вы можете обнаружить, что отправка заголовка типа контента на сервер поможет, например

'application/json; charset=utf-8'

на стороне клиента я использую прототипную клиентскую библиотеку, и при вызове Ajax есть параметр contentType, где вы можете указать это. Я думаю, что jQuery имеет метод getJSON.

альтернатива: используйте универсальный обработчик HTTP (.ashx) и используйте свою любимую библиотеку json для ручной сериализации и десериализации вашего JSON.

Я обнаружил, что полный контроль над обработкой запроса и генерацией ответа превосходит все, что предлагает .NET для простых, спокойных веб-сервисов.