2011-04-11 6 views
2

WCF 4.0 RESTful 서비스를 사용하여 문제가 발생했습니다. 내가 오류의 경우, 반환하는 나머지 서비스를 만들기 위해 노력하고, XML 문서는 문제 예를 설명 :WCF 휴식 오류 처리

내가 템플릿을 사용하여 기본 REST 서비스를 만든이를 만들기 위해
<ErrorHandler> 
     <cause>Resource not available</cause> 
     <errorCode>111103</errorCode> 
    </ErrorHandler> 

비주얼 스튜디오에서 제공 여기 내 서비스 클래스 :

public class Service1 
    { 
     // TODO: Implement the collection resource that will contain the SampleItem instances 

     [WebGet(UriTemplate = "")]   
     public List<SampleItem> GetCollection() 
     { 
      // TODO: Replace the current implementation to return a collection of SampleItem instances\ 
      // throw new WebException("lala"); 
      throw new WebFaultException<ErrorHandler>(new ErrorHandler { cause = "Resource not available", errorCode = 100 }, System.Net.HttpStatusCode.NotFound); 
      //return new List<SampleItem>() { new SampleItem() { Id = 1, StringValue = "Hello" } }; 
     } 

     [WebInvoke(UriTemplate = "", Method = "POST")] 
     public SampleItem Create(SampleItem instance) 
     { 
      // TODO: Add the new instance of SampleItem to the collection   
      return new SampleItem() { Id = 3, StringValue = "59" }; 

     } 

     [WebGet(UriTemplate = "{id}")] 
     public SampleItem Get(string id) 
     { 
      // TODO: Return the instance of SampleItem with the given id 
      throw new NotImplementedException(); 
     } 

     [WebInvoke(UriTemplate = "{id}", Method = "PUT")] 
     public SampleItem Update(string id, SampleItem instance) 
     { 
      // TODO: Update the given instance of SampleItem in the collection 
      throw new NotImplementedException(); 
     } 

     [WebInvoke(UriTemplate = "{id}", Method = "DELETE")] 
     public void Delete(string id) 
     { 
      // TODO: Remove the instance of SampleItem with the given id from the collection 
      throw new NotImplementedException(); 
     } 

    } 
} 

내가 GetCollection 방법에 WebFaultException을 던지고 위에 당신이 코드에서 볼 수 있듯이. 응답의 본문에 "ErrorHandler"객체를 넣어야합니다. 여기 내 ErrorHandler를 클래스와 같은 모습입니다 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Runtime.Serialization; 

namespace WcfRestService1 
{ 
    [DataContract] 
    public class ErrorHandler 
    { 
     [DataMember] 
     public int errorCode { get; set; } 
     [DataMember] 
     public string cause { get; set; } 

    } 
} 

미친 것은이 일의 작품이지만) : down't 것입니다. 내가 말하고자하는 것은 Visual Studio에서 WebFaultException이 사용자 코드에 의해 포착되지 않는다는 오류가 발생한다는 것입니다. 그것은 내 애플 리케이션을 일시 중지합니다. 계속해서 계속 누르면 모든 것이 제대로 작동합니다. 여기 내 문제를 설명하는 일부 사진입니다

피들러에서

첫 번째 단계 : First Step

다음 Visual Studio의 오류 : Visual Studio Error

마지막으로 모든 것을 계속 누르면 작동합니다

그것은으로 이해되지 않는다 나 그리고 나는이 일이 왜 일어나고 있는지 그리고 그것을 고치는 법을 모른다. P. 나는 운이없는 해결책을 찾으려고 노력하는 동안 웹을 검색했다. Visual Studio 2010 Ultimate을 사용하고 있습니다.

답변

3

아무런 문제가 없습니다. 당신은 디버깅 중이며, 예외가 던져지고, 끊어지고, 계속 진행되며, 정상적으로 작동합니다.

예외 처리 옵션 (Ctrl + Alt + E)을 설정하여 예외가 발생할 때 중단되는 것으로 의심됩니다. (옵션에서 "Thrown") 처리되는 것에 관계없이 예외가 발생할 때마다 중단됩니다.

WCF 작업에서 발생하는 예외는 WCF 런타임에서 처리되며 오류 인 경우 채널이 오류를 일으키지 않도록 다시 전송됩니다.

이제 XML을 보내면 WebFaultException<string>을 사용하여 XML의 문자열 표현을 보낼 수 있습니다.

+0

답변 해 주셔서 감사합니다. VS 2010에서 해당 예외를 처리되지 않은 것으로보고하는 이유는 아직 명확하지 않습니다. WCF 런타임에서 예외가 발생하지 않습니까? 내가 이해할 수있는 예외는 런타임에 의해 캐치되어야하며 "원인"개체는 직렬화되어 지정된 http 코드를 사용하여 클라이언트로 다시 전송됩니다. 이상한 점은 2008 년과 2008 년은 이와 같이 행동하지 않는다는 것입니다. 웹 프로토콜 예외를 throw하여 오류를보고하는 데 사용되는 모든 괜찮 았어 (클라이언트가 XML을받지 못할 사실을 제외하고). 내가 2010 대 vs로 업그레이드 한 후에 이런 일이 일어났습니다. – Andrei

+0

나는 2008 년에 일한 적이 없기 때문에 몰랐다. 그러나 나는 이것에 너무 많이 매달리지 않았다. 당신의 웹 사이트가 작동하는 한 그것은 좋다. 하지만 내가 말했듯이 Ctrl + Alt + E를 눌러 VS 설정을 살펴보십시오. – Aliostad

+0

나는 그것을 할 것이다. 하지만 좀 더 휴대용 솔루션을 원합니다. 나는 그 프로젝트에서 일하는 유일한 사람이 아니며,이 해결 방법을 사용하기 위해 팀원 모두에게 실행 가능한 것이 아니라고 요청했다. :) – Andrei