Silverlight 호출 WCF/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)
{
}
실행,결 과 는 다음 과 같 습 니 다:실제 이상 을 볼 수 있 는 것 은'시도 나 누 기 0'이지 만 브 라 우 저 제한 으로 모든 이상 은 NotFound 입 니 다.
msdn 에서 이 문 제 를 해결 할 수 있 는 두 가지 방법 이 있 습 니 다.
가장 쉬 운 것 은 App.xaml.cs 코드 에서 RegisterPrefix 를 사용 하여 예비 클 라 이언 트 HTTP 스 택 을 사용 하 는 것 입 니 다.
public App()
{
bool bRegisterPrefix = WebRequest.RegisterPrefix(http://localhost:9541/,
WebRequestCreator.ClientHttp);
//other Code
}
다시 실행 코드:이것 은 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
다음 주소 입력:http://localhost:9541/Service1.svc/GetData?value=3
이상 한 정 보 를 얻 은 것 을 볼 수 있 습 니 다.
메모:크로스 필드 와 권한 수여 파일 을 추가 하 는 것 을 잊 지 마 세 요: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 클릭Rest 호출 결 과 는 여전히 NotFound 임 을 알 수 있 습 니 다.
Response 속성 과 Status 속성 을 보 여 줍 니 다.
Response 속성의 Response Stream 이 뭔 지 보 세 요.
errorMessage 가 되 돌아 오 는 오 류 를 볼 수 있 습 니 다.분명 합 니 다.우 리 는 그것 을 Exception 의 대상 으로 역 정렬 해 야 합 니 다.
먼저 DataContract Serializer 를 사용 하여 FaultException 클래스 로 역 정렬 하려 고 시도 합 니 다.
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);
다시 실행:직렬 화 는 성공 적 이지 만 직렬 화 된 값 은 모두 잘못된 것 임 을 알 수 있다.
마지막 으로 XML 이상 데이터 가 있 는 이상 xml 데 이 터 를 분석 하고 사용자 정의 이상 을 사용 할 수 없습니다.
우선 SLFaultException 클래스 를 새로 만 들 고 계승 예외:코드 는 다음 과 같 습 니 다.
4.567913.완전한 코드 는 다음 과 같 습 니 다.4.567913.Fault Exception 으로 직렬 화 하 는 것 은 실 패 했 지만 xml 노드 의 Exception Detail 은 반 서열 로 돌아 올 수 있 습 니 다.물론 위의 처리 WebException 과정 은 봉 인 될 수 있 습 니 다.독자 스스로 시도 해 보 세 요.ㅎ
결 과 는 다음 그림 과 같다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Silverlight 2 시리즈 (20): Silverlight 에서 HTML DOM 과 어떻게 상호작용 하 는 지 (하)Silverlight 2 Beta 1 버 전 은 런 타임 이 든 Tools 든 프레임 워 크 언어 Visual Basic, Visual C \ #, IronRuby, Ironpython, JSON, Web Servi...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.