Принуждение веб-сервиса ASP.net возвратить JSON

ПРИМЕЧАНИЕ: Это сообщение закончило тем, что было намного более подробным и поэтому вне темы, я приношу извинения.

, Что, будучи сказанным мои коллеги читают его и верят, это ценно 'где-нибудь'. Этот поток не является местом. Я ценил бы Вашу обратную связь на том, куда это должно пойти (я плохо знаком с сайтом).

<час>

Так или иначе это - версия C# в.NET 3.5, который удивителен в этом, это работает над любым типом набора с помощью определенной семантики. Это - мера по умолчанию (повторное использование!) не производительность или минимизация цикла ЦП в наиболее распространенном dev сценарии, хотя это никогда, кажется, не то, что происходит в реальном мире (преждевременная оптимизация).

*** Дополнительный метод, работающий по любому типу набора и берущий делегата действия, ожидающего единственное значение типа, все выполняемые по каждому объекту наоборот **

Requres 3.5:

public static void PerformOverReversed<T>(this IEnumerable<T> sequenceToReverse, Action<T> doForEachReversed)
      {
          foreach (var contextItem in sequenceToReverse.Reverse())
              doForEachReversed(contextItem);
      }

Более старые версии.NET или Вы хотите понять внутренности Linq лучше? Продолжать читать.. Или нет..

ПРЕДПОЛОЖЕНИЕ: В системе типов.NET Тип массива наследовался интерфейсу IEnumerable (не универсальный IEnumerable только IEnumerable).

Это - все, чего необходимо выполнить итерации с начала до конца, однако Вы хотите переместиться в противоположное направление. Поскольку работы IEnumerable над Массивом типа 'возражают', что любой тип допустим,

КРИТИЧЕСКАЯ МЕРА: Мы принимаем, можно ли обработать какую-либо последовательность в обратном порядке, которая 'лучше' тогда только способность сделать это на целых числах.

Решение a для CLR.NET 2.0-3.0:

Описание: Мы примем любой IEnumerable реализация экземпляра с мандатом, что каждый экземпляр, который это содержит, имеет тот же тип. Таким образом, если мы получаем массив, целый массив содержит экземпляры типа X. Если какие-либо другие экземпляры имеют тип! =X исключение брошен:

одноэлементный сервис А:

общедоступный класс ReverserService {частный ReverserService () {}

    /// <summary>
    /// Most importantly uses yield command for efficiency
    /// </summary>
    /// <param name="enumerableInstance"></param>
    /// <returns></returns>
    public static IEnumerable ToReveresed(IEnumerable enumerableInstance)
    {
        if (enumerableInstance == null)
        {
            throw new ArgumentNullException("enumerableInstance");
        }

        // First we need to move forwarad and create a temp
        // copy of a type that allows us to move backwards
        // We can use ArrayList for this as the concrete
        // type

        IList reversedEnumerable = new ArrayList();
        IEnumerator tempEnumerator = enumerableInstance.GetEnumerator();

        while (tempEnumerator.MoveNext())
        {
            reversedEnumerable.Add(tempEnumerator.Current);
        }

        // Now we do the standard reverse over this using yield to return
        // the result
        // NOTE: This is an immutable result by design. That is 
        // a design goal for this simple question as well as most other set related 
        // requirements, which is why Linq results are immutable for example
        // In fact this is foundational code to understand Linq

        for (var i = reversedEnumerable.Count - 1; i >= 0; i--)
        {
            yield return reversedEnumerable[i];
        }
    }
}



public static class ExtensionMethods
{

      public static IEnumerable ToReveresed(this IEnumerable enumerableInstance)
      {
          return ReverserService.ToReveresed(enumerableInstance);
      }
 }

общедоступный класс Testing123 [TestFixture] {

    /// <summary>
    /// .NET 1.1 CLR
    /// </summary>
    [Test]
    public void Tester_fornet_1_dot_1()
    {
        const int initialSize = 1000;

        // Create the baseline data
        int[] myArray = new int[initialSize];

        for (var i = 0; i < initialSize; i++)
        {
            myArray[i] = i + 1;
        }

        IEnumerable _revered = ReverserService.ToReveresed(myArray);

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));
    }

    [Test]
    public void tester_why_this_is_good()
    {

        ArrayList names = new ArrayList();
        names.Add("Jim");
        names.Add("Bob");
        names.Add("Eric");
        names.Add("Sam");

        IEnumerable _revered = ReverserService.ToReveresed(names);

        Assert.IsTrue(TestAndGetResult(_revered).Equals("Sam"));


    }

    [Test]
    public void tester_extension_method()
  {

        // Extension Methods No Linq (Linq does this for you as I will show)
        var enumerableOfInt = Enumerable.Range(1, 1000);

        // Use Extension Method - which simply wraps older clr code
        IEnumerable _revered = enumerableOfInt.ToReveresed();

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));


    }


    [Test]
    public void tester_linq_3_dot_5_clr()
    {

        // Extension Methods No Linq (Linq does this for you as I will show)
        IEnumerable enumerableOfInt = Enumerable.Range(1, 1000);

        // Reverse is Linq (which is are extension methods off IEnumerable<T>
        // Note you must case IEnumerable (non generic) using OfType or Cast
        IEnumerable _revered = enumerableOfInt.Cast<int>().Reverse();

        Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));


    }



    [Test]
    public void tester_final_and_recommended_colution()
    {

        var enumerableOfInt = Enumerable.Range(1, 1000);
        enumerableOfInt.PerformOverReversed(i => Debug.WriteLine(i));

    }



    private static object TestAndGetResult(IEnumerable enumerableIn)
    {
      //  IEnumerable x = ReverserService.ToReveresed(names);

        Assert.IsTrue(enumerableIn != null);
        IEnumerator _test = enumerableIn.GetEnumerator();

        // Move to first
        Assert.IsTrue(_test.MoveNext());
        return _test.Current;
    }
}
21
задан John Saunders 10 September 2009 в 16:19
поделиться

3 ответа

Вот две ветки форумов для вашей справки:

http://forums.asp.net/t/1118828.aspx

http://forums.asp.net/ p / 1054378 / 2338982.aspx # 2338982

Понятия не имею. Они говорят о том, чтобы сконцентрироваться на установке типа контента на application / json. Я раньше не работал с wcf, но думаю, что вы можете использовать объект Response.

Установите тип содержимого для объекта ответа. Сделайте response.write, передав свои данные json в виде строки, а затем выполните response.end.

2
ответ дан 29 November 2019 в 22:06
поделиться

Веб-сервисы Asp.net - это веб-сервисы на основе SOAP. Они всегда будут возвращать XML. Пришли библиотеки Ajax и был представлен материал ScriptMethod, но он не меняет его базовую концепцию.

Есть несколько вещей, которые вы можете сделать.

WebMethod практически устарели с введением WCF. Вы можете рассмотреть перенос своих веб-сервисов в WCF , в котором у вас будет гораздо больший контроль над форматом вывода.

Если вы не хотите этого делать, вы можете вручную сериализовать результат ваш веб-сервис вызывает JSON, и служба помещает его в заголовок SOAP.

11
ответ дан 29 November 2019 в 22:06
поделиться

Отличный вопрос. Вам не нужно об этом беспокоиться; компилятор позаботится об этом за вас. По сути, мы помещаем код очистки для блоков finally в специальный метод очистки на сгенерированном итераторе. Когда управление покидает блок foreach вызывающей стороны, компилятор генерирует код, который вызывает код очистки на итераторе.

Упрощенный пример:

static IEnumerable<int> GetInts()
{
    try { yield return 1; yield return 2;} 
    finally { Cleanup(); }
}

В основном ваш вопрос: " В блоге рассказывается о строго типизированном преобразовании, которое вы можете выполнять между классами на стороне сервера и объектами JSON от клиента.

Недавно я завершил проект с использованием этого нового материала JSON в .NET 3.5, и я очень впечатлен производительность. Может, стоит взглянуть ...

1
ответ дан 29 November 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: