WCF 계약 - 네임 스페이스 및 직렬화 외환
-
19-09-2019 - |
문제
다음 통화 및 응답을 제공하는 타사 웹 서비스를 사용하고 있습니다.
http://api.athirdparty.com/rest/foo?apikey=1234
<response>
<foo>this is a foo</foo>
</response>
그리고
http://api.athirdparty.com/rest/bar?apikey=1234
<response>
<bar>this is a bar</bar>
</response>
이것은 내가 쓴 계약 및 지원 유형입니다
[ServiceContract]
[XmlSerializerFormat]
public interface IFooBarService
{
[OperationContract]
[WebGet(
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "foo?key={apikey}")]
FooResponse GetFoo(string apikey);
[OperationContract]
[WebGet(
BodyStyle = WebMessageBodyStyle.Bare,
ResponseFormat = WebMessageFormat.Xml,
UriTemplate = "bar?key={apikey}")]
BarResponse GetBar(string apikey);
}
[XmlRoot("response")]
public class FooResponse
{
[XmlElement("foo")]
public string Foo { get; set; }
}
[XmlRoot("response")]
public class BarResponse
{
[XmlElement("bar")]
public string Bar { get; set; }
}
그리고 내 클라이언트가 다음과 같이 보입니다
static void Main(string[] args)
{
using (WebChannelFactory<IFooBarService> cf = new WebChannelFactory<IFooBarService>("thirdparty"))
{
var channel = cf.CreateChannel();
FooResponse result = channel.GetFoo("1234");
}
}
내가 이것을 실행할 때 나는 다음과 같은 예외를 얻습니다
루트 이름 '응답'및 루트 네임 스페이스 ''( 'getfoo'및 계약 ( 'ifoobarservice', 'http://tempuri.org/')) xmlserializer 사용. XML에 해당하는 유형이 알려진 유형의 서비스 모음에 추가되어 있는지 확인하십시오.
내가 댓글을 달면 GetBar
운영 IFooBarService
, 그것은 잘 작동합니다. 나는 여기서 중요한 개념이 놓친 것을 알고 있습니다. 무엇을 찾아야할지 모르겠습니다. 계약 유형을 제대로 구축 할 수 있도록 내 계약 유형을 구성하는 올바른 방법은 무엇입니까?
해결책
나는 당신의 제 3 자 서비스가 심하게 깨 졌다고 말하고 싶습니다. 여기에 네임 스페이스 충돌이 있습니다. response
XML 스키마 유형이 다릅니다.
나는 당신 이이 XML을 사로화하는 것과 관련된 .NET 기술을 사용하지 않아도 될 것이라고 생각합니다. .NET 유형에 XML을 사로화하기 위해 .NET 유형을 알리는 방법은 없습니다.
당신은 손으로해야 할 것입니다. LINQ에서 XML은이 목적을 위해 편리합니다.
다른 팁
다음과 같은 응답 클래스로 시도 할 수 있습니다.
[XmlRoot("response")]
public class Response
{
[XmlElement("foo")]
public string Foo { get; set; }
[XmlElement("bar")]
public string Bar { get; set; }
}
제휴하지 않습니다 StackOverflow