2014-01-20 2 views
1

this article의 예제를 사용하여 내 WCF 데이터 서비스에 클라이언트 인증서 인증을 추가했습니다. SendingRequest 이벤트가 더 이상 사용되지 않고 SendingRequest2으로 대체 된 WCF DataService 5.6을 사용 중이기 때문에 예제를 약간 변경해야했습니다.ClientCertificate를 WCF DataService Client에 적용하는 동안이 InvalidCastException을 해결하는 방법은 무엇입니까?

private void OnSendingRequest_AddCertificate(object sender, SendingRequestEventArgs args) 
{ 
    if (null != ClientCertificate) 
    { 
     ((HttpWebRequest)args.Request).ClientCertificates.Add(ClientCertificate); 
    } 
} 

하려면 :

private void OnSendingRequest_AddCertificate(object sender, SendingRequest2EventArgs args) 
{ 
    if (null != ClientCertificate) 
    { 
     ((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest.ClientCertificates.Add(ClientCertificate); 
    } 
} 

이 작동하는 것 같다

기본적으로이 다음 이벤트 처리기를 변경하는 것을 의미했다.

System.InvalidCastException : 그러나 지금은 일부 작업에 InvalidCastException 다음 가져 오기 ' 을 입력하는 형식 'System.Data.Services.Client.InternalODataRequestMessage '의 개체를 캐스팅 할 수 없습니다를 System.Data.Services.Client .HttpWebRequestMessage '.

나는이이 작업을 100 % 정확하게 식별 할 수 없었다,하지만이 SaveChanges를 방법에 지속적으로 보인다 (스택 트레이스 내가로부터 수정에 온 :

at MyNamespace.MyContainer.OnSendingRequest_AddCertificate(Object sender, SendingRequest2EventArgs args) 
at System.Data.Services.Client.ODataRequestMessageWrapper.FireSendingRequest2(Descriptor descriptor) 
at System.Data.Services.Client.BatchSaveResult.GenerateBatchRequest() 
at System.Data.Services.Client.BatchSaveResult.BatchRequest() 
at System.Data.Services.Client.DataServiceContext.SaveChanges(SaveChangesOptions options) 

아래 참조 시행 착오를 거쳐 SendingRequest ~ SendingRequest2으로 바뀌 었습니다. 아니면 전혀 관련이 없으며 처리기의 if 문에 && args.RequestMessage is HttpWebRequestMessage을 추가해야합니까?

답변

0

일괄 작업을 수행 할 때 문제가 발생하는 것 같습니다.

InternalODataRequestMessage을 통해 클라이언트 인증서를 리플렉션과 DataServices 소스를 사용하여 추가 할 수 있는지 확인하려고했습니다. InternalODataRequestMessage의 인스턴스에서 ODataBatchOperationRequestMessage 개인 회원 requestMessage이 발견되었습니다. source code을 보면 인증서를 추가 할 수 없습니다.

내가주의 한 것은 실제로 이전처럼 더 이상 사용되지 않는 SendingRequest 이벤트를 사용할 수 있다는 것입니다. 그래서 그것이 내가 한 일이고 모든 것이 잘된 것처럼 보입니다.

나는 더 이상 사용되지 않는 방법을 사용하지 않고 클라이언트 인증서를 사용하는 방법이 있어야한다고 생각합니다. 그래서 누군가가 그 대답을 보여 준다면, 나는 그것을 받아 들일 것입니다.

2

일괄 요청을 보내는 것으로 보입니다. 일} 처리 요청에는 InternalODataRequestMessage 인 몇 가지 내부 요청이 들어 있습니다. SendingRequest2는 $ 일괄 요청과 내부 요청 모두에 OnSendingRequest 액션을 적용합니다.

당신은 그렇지 않은 경우는 false를 돌려, 코드

private void OnSendingRequest_AddCertificate(object sender, SendingRequest2EventArgs args) 
{ 
    if (null != ClientCertificate && !args.IsBatchPart) 
    { 
     ((HttpWebRequestMessage)args.RequestMessage).HttpWebRequest.ClientCertificates.Add(ClientCertificate); 
    } 
} 

이 이벤트가 배치 내 요청에 대해 발사되는 경우 args.IsBatchPart가 true를 돌려 다음 시도 할 수 있습니다.

+0

그래서 일괄 처리 작업 요청은 여러 요청을 래핑하고 해당 요청을 포함하는 각 요청에 대해서도 해당 이벤트가 실행된다는 것입니다. 나는 일괄 작업이 여러 작업을 설명하는 하나의 요청이라는 것을 항상 이해했습니다. 이 코드를 작업 한 이후로 꽤 오래되었습니다.나는 이것을 곧 시험해 볼 기회가 있는지 확신 할 수 없다. 내가 가지고있을 때, 나는 그 결과로 다시 체크 할 것이다. 어쨌든 고마워! –