.net脚本Web服务:__ type属性

时间:2011-02-10 14:39:49

标签: .net web-services asmx json

我正在使用从客户端脚本调用的.net脚本服务,它运行得非常好。

唯一的问题是 - 它会生成一个' __ type'每个返回对象的属性,我不想要或不需要 我在网上看到了一些关于此事的帖子,据我所知,只有'变通办法'为此:

  • 有些人建议隐藏返回类型的无参数c'内部受保护',

  • 其他人建议不要使用[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 个答案:

答案 0 :(得分:3)

好的,所以我最终接受了Jhon Morrison的建议,发布在@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 http://stackoverflow.com/questions/4958443/net-script-web-services-type-attribute
        protected internal MyClass()
        {

        }
    }

@ Kid的答案也有效,但这样看起来比较干净。

答案 1 :(得分:2)

我注意到作为对象返回的匿名类型根本不会产生__Type属性。由于不同的原因,我已经返回了一些像这样的对象,Javascript不关心,它喜欢匿名类型。所以我想我会开始转换许多其他类型,将它们转换为所有对象继承的基础对象。服务层将处理这个,因为我喜欢传递强类型,并且不想在最后一刻之前将其转换。这个演员需要时间吗?大概。这值得么?吉兹,我不知道。我同意,出于安全原因,这些信息不应该在那里。来吧微软。

答案 2 :(得分:0)

如果您将返回类型从IEnumerable<EmployeePO>更改为IEnumerable<Object>,则__type字段不会添加到JSON字符串中。

答案 3 :(得分:0)

我做的有点不同,对我来说有点清洁。 (我不想试图删除之前的答案,只是尝试添加/减少所需的编码量。)

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
}