.net script web services: __type attribute
I'm using a .net script service which is called from client-side script, and it works very nicely.
only problem is- it generates a '__type' attribute for each of the returned objects, which I don't want or need.
I've seen a few posts about this over the web, and as far as I could tell, there are only 'workarounds' for this:some people suggested hiding the parameter-less c'tor of the return type as 'internal protected',
others suggested not using the [ScriptMethod] ta开发者_运维知识库g, and instead JSONfy the result manually and return a string.
I'm wondering whether there is another, better, solution for this. and by the way- what is this attribute used for, anyway?
I'm enclosing the service method and the generated JSON.method:
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
public IEnumerable<EmployeePO> GetEmployeesForDepartment(int DepartmentId)
{
return new AdministrationController().GetEmployeesForDepartment(DepartmentId);
}
JSON returned:
{"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":[...
OK so I ended up taking the advice from Jhon Morrison, posted in the question @Kid linked to-
I defined all the parameter-less constructors on my returned classes as protected internal and that really did the trick.
In cases where I actually needed to create empty objects I created a Factory method, like so:
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's answer also worked, but it looked cleaner to me this way.
I have noticed that anonymous types returned as object do not produce the __Type attribute at all. I had returned some of my objects like this for different reasons and Javascript dont care, it loves anonymous types. So I suppose I will start converting many of the other types casting them down to the base object that all objects inherit from. The service layer will handle this because I like passing around strong types and don't want to convert it until the last minute. Does this casting take time? Probably. Is it worth it? Geez, I don't know. I agree tho, that this info should not be in there for security reasons. C'mon Microsoft.
I did it a little different and for me a little cleaner. (I'm not trying to take away from the previous answer, just trying to add / reduce the amount of coding required.)
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
}
If you change the return type from IEnumerable<EmployeePO>
to IEnumerable<Object>
, the __type
field won't be added to the JSON string.
精彩评论