Nano Hash - криптовалюты, майнинг, программирование

.net framework 2.0 C# и строка формата веб-запроса json

Я создал веб-сервис на С#, который выглядит так:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string UpdateHeatCallJSON(string json)
    {
        HeatItem item = JsonConvert.DeserializeObject<HeatItem>(json);
        UpdateHeatCall(item);
        HeatItemResponse response = new HeatItemResponse();
        //... more code
        return JsonConvert.SerializeObject(response);
    }

У меня есть объект HeatItem, который я хочу передать в качестве аргумента.

В настоящее время я использую веб-службу (для тестирования) в консольном приложении С# и испытываю проблемы с поиском правильного формата. Это мой звонок:

   static void UpdateHeatItemJSON()
    {
        // corrected to WebRequest from HttpWebRequest
        WebRequest request = WebRequest.Create(requestServer + "/UpdateHeatCallJSON");

        request.Method = "POST";
        request.ContentType = "application/json; charset=utf-8";
        string postData = "";
        postData = @"{'json':'{""BusinessPartner"":""00000000-0000-0000-0000-000000000000"",""CaseNumber"":4,""CaseDescription"":""first case"",""CaseType"":"""",""CaseSeverity"":"""",""DueDate"":""0001-01-01T00:00:00"",""AssignmentNumber"":5,""AssignmentDescription"":"""",""AssignmentCreation"":""0001-01-01T00:00:00"",""AssignmentTime"":""0001-01-01T00:00:00"",""ChangeDate"":""0001-01-01T00:00:00"",""ChangeTime"":""0001-01-01T00:00:00"",""Group"":"""",""SubGroup"":"""",""Module"":"""",""AssignmentStatus"":"""",""KPIChallenge"":false,""KPI1Status"":"""",""KPI1User"":"""",""KPI1Date"":""0001-01-01T00:00:00"",""KPI1Time"":""0001-01-01T00:00:00"",""KPI2Status"":"""",""KPI2User"":"""",""KPI2Date"":""0001-01-01T00:00:00"",""KPI2Time"":""0001-01-01T00:00:00"",""SessionID"":null}'}";

        System.Diagnostics.Debug.Print(postData);

        //get a reference to the request-stream, and write the postData to it
        using (Stream s = request.GetRequestStream())
        {
            using (StreamWriter sw = new StreamWriter(s))
                sw.Write(postData);
        }

        //get response-stream, and use a streamReader to read the content
        using (Stream s = request.GetResponse().GetResponseStream())
        {
            using (StreamReader sr = new StreamReader(s))
            {
                string jsonData = sr.ReadToEnd();
                JObject jObject = JObject.Parse(jsonData);
                JToken jHeatItem = jObject["HeatItem"];
            }
        }
    }

Глядя на postData выше, форматирование строки json, как указано выше, работает, однако, когда я проверяю строку на http://jsonlint.com/ проверка не проходит. Когда я передаю проверенную строку json следующим образом:

{ "json": { "BusinessPartner": "00000000-0000-0000-0000-000000000000", "CaseNumber": 4, "CaseDescription": "первый случай", "CaseType": "", "CaseSeverity": "" , "DueDate": "0001-01-01T00:00:00", "AssignmentNumber": 5, "AssignmentDescription": "", "AssignmentCreation": "0001-01-01T00:00:00", "AssignmentTime": "0001-01-01T00:00:00", "ChangeDate": "0001-01-01T00:00:00", "ChangeTime": "0001-01-01T00:00:00", "Группа": "" , "SubGroup": "", "Module": "", "AssignmentStatus": "", "KPIChallenge": false, "KPI1Status": "", "KPI1User": "", "KPI1Date": "0001-01 -01T00:00:00", "KPI1Time": "0001-01-01T00:00:00", "KPI2Status": "", "KPI2User": "", "KPI2Date": "0001-01-01T00:00 :00", "KPI2Time": "0001-01-01T00:00:00", "SessionID": null } }

веб-сервис возвращает 500 Internal Server Error, что, как я полагаю, связано с тем, что ему не нравится переданный аргумент. Я относительно новичок в этом, и мне интересно, может ли кто-нибудь помочь мне понять это немного лучше.

Также глядя на ответ (для рабочего примера), возвращаемый json содержит три обратных наклона \\, я считаю, чтобы избежать кавычек. Это делает этот вызов

                JObject jObject = JObject.Parse(jsonData);
                JToken jHeatItem = jObject["HeatItem"];

терпеть неудачу. Есть идеи, почему?

Спасибо, Томас.


  • В строках Json необходимо использовать двойные, а не одинарные кавычки. 08.10.2012

Ответы:


1

При настройке запроса я добавил request.Accept = "application/json; charset=utf-8";. Убедитесь, что служба украшена атрибутом ScriptService. Например.,

[System.Web.Script.Services.ScriptService]    
public class Service1 : System.Web.Services.WebService

Когда вы форматируете свои данные сообщения, этот стиль работал для меня:

@"{""json"":'{""test"": ""value""}'}";

Ключевым моментом, казалось, было обеспечение того, чтобы после двоеточия в JSON была одна кавычка.

Что касается нежелательных символов обратной косой черты, перейдите по этой ссылке http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/. По сути, дело в том, что вы возвращаете объект из своего сервиса, а не строку. То же самое относится и к передаче объектов в вашу службу.

08.10.2012
  • Да, это форматирование, которое работает и для меня, но я все еще пытаюсь понять, почему я не могу использовать строку, которая может быть проверена. И тот, который работает, не может быть проверен (на некоторых сайтах проверки строк json). В любом случае, я должен быть счастлив заставить его работать. Тем не менее, все еще борюсь с обратной косой чертой. 08.10.2012
  • Почему бы не попробовать вернуть из службы HeatItemResponse, а не строку? Если сериализация JSON работает так, как должна, вы не должны получать обратную косую черту. 08.10.2012

  • 2

    Чувствую себя идиотом, тратящим на это кучу времени, теперь, когда все так просто. Пусть asp.net позаботится об этом. Выполнил шаги, описанные в этом посте, и все работает отлично

    http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

    08.10.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..