Silverlight 호출 WCF/Rest 이상 해결 방법 분석

8921 단어 SilverlightWCFRest
새 Rest 서비스 인터페이스:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string GetData(int value);
}
이 어 새 서비스 구현 클래스:

public class Service1 : IService1
{
    public string GetData(int value)
    {
        int i = 0;
        int j = 5 / i;
        return string.Format("You entered: {0}", value);
    }
}
여기 서 Service 1 에"divided by zero exception:"

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="WcfService1.Service1">
      </service>
    </services>
  </system.serviceModel>
여기 서를 주의 하 십시오.
Silverlight 클 라 이언 트 에 서비스 인용 을 추가 합 니 다.이름 은:ServiceReference 1 입 니 다.
페이지 에 단 추 를 추가 합 니 다.단추 의 Click 이벤트 코드 는 다음 과 같 습 니 다

private void Button_Click(object sender, RoutedEventArgs e)
{
     Service1Client client = new ServiceReference1.Service1Client();

     client.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(client_GetDataCompleted);
     client.GetDataAsync(35); //Try GetData
}

void client_GetDataCompleted(object sender, ServiceReference1.GetDataCompletedEventArgs e)
{
}

실행,결 과 는 다음 과 같 습 니 다:
image
실제 이상 을 볼 수 있 는 것 은'시도 나 누 기 0'이지 만 브 라 우 저 제한 으로 모든 이상 은 NotFound 입 니 다.
msdn 에서 이 문 제 를 해결 할 수 있 는 두 가지 방법 이 있 습 니 다.
가장 쉬 운 것 은 App.xaml.cs 코드 에서 RegisterPrefix 를 사용 하여 예비 클 라 이언 트 HTTP 스 택 을 사용 하 는 것 입 니 다.

public App()
        {
            bool bRegisterPrefix = WebRequest.RegisterPrefix(http://localhost:9541/,

WebRequestCreator.ClientHttp);
            //other Code
        }

다시 실행 코드:image
이것 은 SL 이 WCF 서 비 스 를 호출 하여 이상 을 어떻게 처리 하 는 방식 입 니 다.그러면 Rest 서 비 스 를 호출 합 니까?
우선 웹.config 노드 의 serviceModel 을 수정 하여 Rest 를 지원 하도록 해 야 합 니 다

 <system.serviceModel>

    <behaviors>

      <endpointBehaviors>
        <behavior name="EndpointBehavior">
          <webHttp helpEnabled="true" defaultOutgoingResponseFormat="Json"
          faultExceptionEnabled="true" />
        </behavior>
      </endpointBehaviors>

      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>

    </behaviors>

    <services>
      <service behaviorConfiguration="ServiceBehavior" name="WcfService1.Service1">
        <endpoint behaviorConfiguration="EndpointBehavior" binding="webHttpBinding"
        bindingConfiguration="" name="Rest" contract="WcfService1.IService1" />
      </service>
    </services>

  </system.serviceModel>
웹 Http 노드 의 faultException Enabled=true 를 설정 하고 serviceDebug 의 includeException DetailInFaults 를 true 로 설정 합 니 다.
OK,서비스의 Web.config 파일 이 설정 되 었 습 니 다.다음은 GetData 방법 에 WebGet 특성 을 추가 해 야 합 니 다

public class Service1 : IService1
        {
            [WebGet()]
            public string GetData(int value)
            {
                int i = 0;
                int j = 5 / i;

                return string.Format("You entered: {0}", value);
            }
        }

실행:
주소:http://localhost:9541/Service1.svc/help
image
다음 주소 입력:http://localhost:9541/Service1.svc/GetData?value=3
image
이상 한 정 보 를 얻 은 것 을 볼 수 있 습 니 다.
메모:크로스 필드 와 권한 수여 파일 을 추가 하 는 것 을 잊 지 마 세 요:crossdomain.xml 과 clientaccesspolicy.xml 을 사이트 루트 디 렉 터 리 에 추가 하 는 것 을 잊 지 마 세 요.
마찬가지 로 SL 클 라 이언 트 페이지 를 수정 하고 Button,button 의 코드 이 벤트 를 추가 합 니 다.

private void btnRest_Click(object sender, RoutedEventArgs e)
        {
            WebClient wc = new WebClient();

            wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(

wc_DownloadStringCompleted);
            wc.DownloadStringAsync(new Uri("http://localhost:9541/Service1.svc/GetData?value=3"));
        }

        void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                throw e.Error;
            }
        }

실행,btnRest 클릭
image
Rest 호출 결 과 는 여전히 NotFound 임 을 알 수 있 습 니 다.
Response 속성 과 Status 속성 을 보 여 줍 니 다.
Response 속성의 Response Stream 이 뭔 지 보 세 요.
image
errorMessage 가 되 돌아 오 는 오 류 를 볼 수 있 습 니 다.분명 합 니 다.우 리 는 그것 을 Exception 의 대상 으로 역 정렬 해 야 합 니 다.
먼저 DataContract Serializer 를 사용 하여 FaultException 클래스 로 역 정렬 하려 고 시도 합 니 다.
image
Fault Exception 클래스 로 역 정렬 하려 고 시 도 했 지만 XML 데이터 의 Element 이름 은 Fault 입 니 다.그래서 실 패 했 습 니 다.혹시 Fault 류 가 있 습 니까?하지만 오랫동안 찾 아 봤 지만 Fault 류 는 발견 되 지 않 았 습 니 다.
하지만 ReadObject 방법 에서 verify Object Name 의 재 부팅 을 발 견 했 습 니 다.
코드 변경:

DataContractSerializer serializer = new DataContractSerializer(
typeof(FaultException));

//object deserializerObject = serializer.ReadObject(errorStream);
object deserializerObject = serializer.ReadObject(XmlReader.Create(errorStream),false);

다시 실행:
image
직렬 화 는 성공 적 이지 만 직렬 화 된 값 은 모두 잘못된 것 임 을 알 수 있다.
마지막 으로 XML 이상 데이터 가 있 는 이상 xml 데 이 터 를 분석 하고 사용자 정의 이상 을 사용 할 수 없습니다.
우선 SLFaultException 클래스 를 새로 만 들 고 계승 예외:코드 는 다음 과 같 습 니 다.
4.567913.완전한 코드 는 다음 과 같 습 니 다.4.567913.Fault Exception 으로 직렬 화 하 는 것 은 실 패 했 지만 xml 노드 의 Exception Detail 은 반 서열 로 돌아 올 수 있 습 니 다.물론 위의 처리 WebException 과정 은 봉 인 될 수 있 습 니 다.독자 스스로 시도 해 보 세 요.ㅎ
결 과 는 다음 그림 과 같다.
image

좋은 웹페이지 즐겨찾기