2009-12-16 4 views
8

.net 서비스 모델을 사용하여 C# 웹 서비스를 호출하고 때로는이 웹 서비스가 Microsoft.SharePoint.SoapServer.SoapServerException을 throw합니다. FaultException을 사용하여 웹 서비스에서 반환 된 친숙한 오류 메시지를 얻을 수는 없지만 클라이언트 코드에서이 예외를 catch 할 수는 있습니다.WebServices에서 FaultException 캐치

다음은 예외가있을 때 웹 서비스에 대한 네트워크 추적입니다.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
     <soap:Fault> 
      <faultcode>soap:Server</faultcode> 
      <faultstring>Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</faultstring> 
      <detail> 
       <errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Access to this Web site has been blocked. 
    Please contact the administrator to resolve this problem.</errorstring> 
       <errorcode xmlns="http://schemas.microsoft.com/sharepoint/soap/">0x81020071</errorcode> 
      </detail> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

위의 응답에서 오류 문자열 노드간에 콘텐츠를 가져 오는 데 매우 관심이 있습니다. 그러나 FaultException 클래스에서 위의 오류 메시지를 검색 할 수 없습니다. .NET 프레임 워크가 위의 응답을 올바르게 deserialize하지 않거나 잘못된 excepetion 클래스를 사용하고 있습니다.

FaultException에서 얻을 수있는 유일한 오류 메시지는 "Microsoft.SharePoint.SoapServer.SoapServerException '형식의 예외가 throw되었습니다"라는 것입니다.

웹 서비스를 제어 할 권한이 없습니다.

답변

24

나는 해결책을 찾을 수 있었다 이것에 좀 더 많은 시간을 소비 한 후에는

FaultException faultException = (FaultException)exception; 
MessageFault msgFault = faultException.CreateMessageFault(); 
XmlElement elm = msgFault.GetDetail<XmlElement>(); 

귀하의 답변에 대한 여러분 모두 감사합니다, 다음 코드 세그먼트를 사용하여 예외 메시지에 액세스 할 수 있습니다.

+0

감사합니다. 코드에서 방금 내 문제를 해결하는 방법을 알려주었습니다 (몇 시간 후에). 리플렉션을 통해 wcf proxy 클래스의 메소드를 호출하는 경우, clr이 내부 예외로 예외 예외를 발생시키는 것을 알아야합니다. –

2

웹 서비스는 예외를 직접 사용하지 않습니다. 대신 그들은 실수를 반환합니다. WSDL은 <detail/> 요소의 내용과 함께 가능한 오류를 설명하기위한 것입니다. 반환되는 오류를 확인하려면 WSDL을 살펴 봐야합니다.

오류의 이름이 SharePointFault 인 경우 WCF는 예외를 FaultException<SharePointFault>으로 변환합니다. 이 예외는 아마도 errorstringerrorcode에 대한 속성을 갖습니다. 이러한 등록 정보를 사용하여 오류 메시지에서 전송 된 값을 검색 할 수 있어야합니다.

+0

음 ... 나는 웹 서비스의 WSDL 정의에서 그런 설명을 보지 못했습니다. 그러나 위의 웹 서비스를 정상적인 웹 참조 (서비스 참조가 아닌)로 사용하면 위의 예외를 System.Web.Services.Protocols.SoapException으로 잡을 수 있으며 OuterXml 또는 InnerXml 속성을 사용하여 오류 메시지에 액세스 할 수 있습니다 System.Web.Services.Protocols.SoapException 개체에 대한 설명입니다. – Shamika

+0

wsdl : fault 요소가 없으면 http://msdn.microsoft.com/en-us/library/system.servicemodel.faultexception.createmessagefault.aspx를 사용하여 문제가 발생합니다. –

+0

예. 유일한 옵션입니다. – Shamika