문제

다음 통화 및 응답을 제공하는 타사 웹 서비스를 사용하고 있습니다.

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; }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top