2011-10-23 1 views
2

javascript에서 호출해야하는 wcf 서비스를 만들어야합니다.AJAX 지원 wcf 서비스에서 DataContractResolver 사용

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
public class ClientRequestService : IClientRequestService 
{ 
    [WebGet] 
    [ApplyProxyDataContractResolver] 
    public ResponseData ProcessClientRequest(String pageId) 
    { 
     ... 
    } 
} 

이 방법은 유형이 나는 컴파일 타임에 알 수없는 물체를 반환해야 다음과 같이 서비스가 정의된다. 따라서 호출 될 때 다음 예외가 발생합니다.

형식 ... 데이터 계약 이름이 ... 필요하지 않습니다. DataContractResolver를 사용하거나 KnownTypeAttribute 특성을 사용하거나 DataContractSerializer에 전달 된 알려진 형식 목록에 추가하여 알려진 형식 목록에 정적으로 알려지지 않은 형식을 추가하는 것이 좋습니다.

맞춤 DataContractResolver를 만들고 내 서비스에 맞춤 DataContractResolver를 첨부하기 위해 IOperationBehavior 인터페이스를 구현하는 속성을 만듭니다.

public class ApplyProxyDataContractResolverAttribute : Attribute, IOperationBehavior 
{ 
    public void ApplyDispatchBehavior(OperationDescription description, DispatchOperation dispatch) 
    { 
     var dataContractSerializerOperationBehavior = 
       description.Behaviors.Find<DataContractSerializerOperationBehavior>(); 
     dataContractSerializerOperationBehavior.DataContractResolver = new ProxyDataContractResolver(); 
    } 
} 

ApplyDispatchBehavior가 성공적이라고하지만 내 사용자 지정 DataContractResolver의 방법은 호출되지 않습니다 내가 같은 예외를 얻을 방법

.

ServiceRoute 클래스를 사용하거나 svc 파일을 사용하여 서비스를 등록하려고했는데 어쨌든 작동하지 않습니다.

+0

이 솔루션을 얻는 데 사용한 어떤 문서가 있습니까? – kroonwijk

+0

동일한 문제가 발생합니다. 누구나 대답 있어요? – kelloti

답변

2

WebHttpBehavior와 WebScriptEnablingBehavior는 이미 자체 직렬화를 플러그 인하는 자체 직렬화 작업을 플러그 인하는 자체 직렬화 포매터를 연결한다는 것이 문제라고 생각합니다. 사용자 지정 serializer가 모든 serialization 및 deserializations에서 호출되기 때문에 경로가 호출되지 않습니다.

당신이해야 할 일은 그 경로를 모두 오버라이드하는 것입니다. 방법은 다음과 같습니다.

지금 WebHttpBehavior를 사용중인 경우 하위 클래스를 만듭니다. 대신 WebScriptEnablingBehavior를 사용하는 경우 대신 서브 클래 싱하십시오.

그런 다음 두 메소드를 오버라이드 (override) :

System.ServiceModel.Description.WebHttpBehavior.GetDefaultClientFormatter(OperationDescription, Boolean, Boolean) : IClientMessageFormatter 

System.ServiceModel.Description.WebHttpBehavior.GetDefaultDispatchFormatter(OperationDescription, Boolean, Boolean) : IDispatchMessageFormatter 

은 그들을 무시 반사판을 사용하고 WebHttpBehavior와 WebScriptEnablingBehavior의 기본 구현을 살펴하는 방법을 이해합니다.

자신 만의 작업 포맷터를 연결해야합니다. 차례로 자신의 조작 비헤이비어를 연결하고 새 비 시리얼 라이저를 연결합니다. DataContractJsonSerializerOperationFormatter 및 DataContractJsonSerializerOperationBehavior의 구현을 살펴보고 사용 방법과 인스턴스화 방법을 확인하여 내 뜻을 확인하십시오.

나는 이것이 당신이 원했던 것보다 더 많은 일을하지만, 그것이 소리보다 간단하다는 것을 알고 있으며, 당신이 찾고있는 것을 정확하게 할 수있게 해줄 것입니다!

관련 문제