2011-02-10 2 views
1

클라이언트 측 스크립트에서 호출되는 .net 스크립트 서비스를 사용하고 있으며 매우 잘 작동합니다..net 스크립트 웹 서비스 : __type 속성

유일한 문제는 - 원하지 않는 각각의 반환 된 객체에 대해 '__type'속성을 생성합니다.
나는 웹을 통해 이것에 대해 몇 가지 게시물을 본, 그리고 것까지,이 경우에만 '해결 방법'이있다 내가 말할 수로 :

  • 어떤 사람들은 매개 변수가없는 c'tor을 숨기고 제안이

  • 기타는 [ScriptMethod] 태그를 사용하지 말고 수동으로 JSON 결과를 반환하고 문자열을 반환하는 것이 좋습니다.

다른 해결책이 더 있는지 궁금합니다. 그런데이 속성은 어쨌든 사용 되었습니까?
서비스 메서드와 생성 된 JSON을 묶습니다.

방법 :

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

     return new AdministrationController().GetEmployeesForDepartment(DepartmentId); 

} 

JSON 반환 : 나는 익명 형식이 전혀 __type 속성을 생성하지 않는 개체로 반환 것으로 나타났습니다

{"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":[... 
+0

왜 신경 써야합니까? 그냥 무시할 수 없니? –

+1

물론 JSON을 사용하는 요지는 가능한 한 오브젝트를 가볍게 만드는 것입니다. 그 여분의 속성은 내 물건의 무게입니다. –

+0

@Groxx : 프로덕션 환경에서 "스택 추적을 덤프"하는 것을 선호합니다. 프로덕션 환경에서 버그가있는 코드를 실행하는 대신 오류를 찾을 수 있도록 도와줍니다. –

답변

3

OK 그래서 나는 내부 보호하고 정말 트릭을했던 것처럼
내가 내 반환 클래스의 모든 매개 변수가없는 생성자를 정의 간 연결 @Kid 질문에 게시, Jhon 모리슨로부터 조언을 복용했다. 실제로 내가 지금처럼 공장 방법을 만들어 빈 개체를 만드는 데 필요한 경우
: 아이의 대답 @

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() 
     { 

     } 
    } 

도 일을하지만,이 방법을 나에게 청소기 보았다.

2

. 나는 다른 이유로 이러한 객체들을 반환했지만 Javascript는 신경 쓰지 않아 익명의 타입을 좋아합니다. 그래서 내가 다른 유형의 많은 것들을 모든 객체가 상속받은 기본 객체로 변환하는 것을 시작한다고 가정합니다. 왜냐하면 나는 강한 타입을 지나치게 좋아하고 마지막 순간까지 그것을 변환하고 싶지 않기 때문에 서비스 레이어가 이것을 처리 할 것이다. 이 캐스팅에 시간이 걸립니까? 아마. 그만한 가치가 있니? 이런, 나도 몰라. 나는이 정보가 보안상의 이유로 거기에 있으면 안된다는 것에 동의한다. 마이크로 소프트를 불러라.

+0

이것은 최상의 솔루션 일 수 있습니다. 사용중인 POCO와 정확히 같은 필드를 포함하는 익명 형식을 반환하는 예제를 줄 수 있습니까? –

+0

오늘 나는 그걸로 더 어지럽 힌다. 나는 그것이 창조하고 유지하는 것이 훨씬 더 많아 질 것입니다 모든 것을 변환하지 않을 것입니다. 다른 방법이 있어야합니다. 내 대답은 명확하지 않았다는 것을 깨달았습니다. 여기에 예제가 있습니다. 개체를 복제 한 익명 개체를 만든 다음이를 type 개체로 캐스팅하고 this ... object returnValue = (object) new {Property1 = myObject.Property1 , Property2 = myObject.Property2}; 보시다시피 익명 객체에서 만든 객체를 반환하므로 익명 객체의 네임 스페이스에 존재하지 않습니다. – Kid

+0

이 프로세스를 자동화하는 방법을 작성할 수 있습니까? – Kid

0

반환 유형을 IEnumerable<EmployeePO>에서 IEnumerable<Object>으로 변경하면 __type 필드가 JSON 문자열에 추가되지 않습니다.

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 
}