Веб-сервисы скрипта .net: атрибут __type - PullRequest
1 голос
/ 10 февраля 2011

Я использую сервис скриптов .net, который вызывается из клиентского скрипта, и он работает очень хорошо.

Единственная проблема - он генерирует атрибут '__type' для каждого из возвращаемых объектов, который мне не нужен или не нужен.
Я видел несколько сообщений об этом в Интернете, и, насколько я могу судить, для этого есть только «обходные пути»:

  • некоторые люди предлагали скрыть c'or без параметров типа возврата как «внутренняя защита»,

  • другие предложили не использовать тег [ScriptMethod], а вместо этого JSONfy результат вручную и вернуть строку.

Мне интересно, есть ли другое, лучшее решение для этого. и, кстати, для чего вообще используется этот атрибут?
Я прилагаю метод обслуживания и сгенерированный JSON.

метод:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
public IEnumerable<EmployeePO> GetEmployeesForDepartment(int DepartmentId)
{

        return new AdministrationController().GetEmployeesForDepartment(DepartmentId);

}

JSON вернуло:

{"d":[{"__type":"Application.Controllers.PresentationObjects.EmployeePO","Positions":[{"__type":"Application.Controllers.PresentationObjects.PositionPO","Id":4,"Name":"Employee: 1test Position 1","IsPriority":false,"WarningThreshold":50,"CriticalThreshold":60,"CurrentWaitingTime":-1,"Passengers":[],"Qualifications":[...

Ответы [ 4 ]

3 голосов
/ 17 мая 2011

ОК, поэтому я в конечном итоге воспользовался советом Джона Моррисона, который был опубликован в вопросе @Kid связан с -
Я определил все конструкторы без параметров в моих возвращаемых классах как защищенные внутренние, и это действительно помогло.
В тех случаях, когда мне действительно нужно было создавать пустые объекты, я создавал метод Factory, например:

public class MyClass
    {
        public int Id { get; set; }
        /*...*/

        public MyClass(int id):
        {
            Id = id;
        }


        public static MyClass CreateNewZonePO()
        {
            return new MyClass();
        }

        //parameterless c'tor for serialization's sake
        //it's protected internal in order to avoid the "__type" attribute when returned from a web service. see /3348000/veb-servisy-skripta-net-atribut-type
        protected internal MyClass()
        {

        }
    }

@ Ответ Кидса тоже сработал, но для меня он выглядел чище.

2 голосов
/ 12 мая 2011

Я заметил, что анонимные типы, возвращаемые как объект, вообще не производят атрибут __Type. Я возвратил некоторые из своих объектов, таких как этот, по разным причинам, и Javascript не волнует, он любит анонимные типы. Поэтому я предполагаю, что начну преобразовывать многие другие типы, приводя их к базовому объекту, от которого наследуются все объекты. Служебный слой справится с этим, потому что мне нравится передавать сильные типы и я не хочу конвертировать его до последней минуты. Этот кастинг занимает время? Наверное. Стоит ли оно того? Боже, я не знаю. Я согласен с тем, что эта информация не должна быть там по соображениям безопасности. Давай, Microsoft.

0 голосов
/ 01 июня 2012

Я сделал это немного по-другому и для меня немного чище.(Я не пытаюсь отказаться от предыдущего ответа, просто пытаюсь добавить / уменьшить объем требуемого кодирования.)

public class MyClass
{ 
    private MyClass(int id) { } //needs to have a constructor with at least one parameter passed to it. Update: looks like this is not needed. I still need to test this some more though.

    protected internal MyClass() { } //this actually drives the restriction on the JSON return of the __type attribute and is an overload constructor
}
0 голосов
/ 24 февраля 2012

Если вы измените тип возвращаемого значения с IEnumerable<EmployeePO> на IEnumerable<Object>, поле __type не будет добавлено в строку JSON.

...