안녕,루트 이름이 'Binary'이고 루트 네임 스페이스 인 XML 본문을 deserialize 할 수 없습니까?
나는 (클라이언트) ASP.NET WCF와 웹 서비스와 통신을 시도하고이 (: Connect to a password protected server with WCF over HTTP 자세한 내용은 여기를) 해결하기 위해 길을 따라왔다입니다.
요청 메소드 실행하는 경우 : 나는 다음과 같은 예외가
var proxy = factory.CreateChannel();
var response = proxy.GetMyData(id);
을 :
루트 이름 '진'과 루트 네임 스페이스 ''(작동을 위해 'GetMyData'로 XML 본체를 역 직렬화 할 수 없습니다및 계약 ('ICFService', 'http://tempuri.org/'))을 사용하여 XmlSerializer를 사용합니다. XML에 해당하는 유형이 서비스의 알려진 유형 콜렉션에 추가되었는지 확인하십시오. 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오. 예외 정보 : System.Runtime.Serialization.SerializationException : XmlSerializer를 사용하여 루트 이름 'Binary'및 루트 네임 스페이스 ''(작업 'GetMyData'및 계약 ('ICFService', 'http://tempuri.org/'))로 XML 본문을 deserialize 할 수 없습니다. XML에 해당하는 유형이 서비스의 알려진 유형 콜렉션에 추가되었는지 확인하십시오.
인코딩 문제 일 수 있습니까? 어떻게 해결합니까?
BestRegards
EDIT1 : 나는 "서비스"의 인터페이스에 다음 줄을 추가 한 :
[ServiceKnownType(typeof(MyObject))]
하지만이 문제가 해결되지 않습니다.
는 또한 새로운 예외가 빈 지금 던진 것을 추가 할 :
루트 레벨에서 데이터가 잘못되었습니다. 줄 1, 위치 1 설명 : 현재 웹 요청을 실행하는 동안 처리되지 않은 예외가 발생했습니다. 오류 및 코드에서 시작된 위치에 대한 자세한 정보는 스택 추적을 검토하십시오. 예외 정보 : System.Xml.XmlException : 루트 수준의 데이터가 잘못되었습니다. 1 호선, 1 번 위치.
이것은 처음에는 예외가되는 경우가 많지만, 다시 시도 할 때 다른 예외가 발생합니까?
webservice는 두 가지 유형의 XML 문서를 반환하도록 설정되었으며 실제 메시지에는 몇 가지 정보가 포함되어 있으며이를 내 응용 프로그램에서 제거합니다. XmlRoot 및 XmlElement 특성을 가진 해당 클래스를 만들었습니다 (이것은 내가 추가 한 클래스입니다. 알려진대로 서비스 인터페이스에 대한 표준). 리턴 될 수있는 다른 메시지는 오직 문자열을 포함 할 것이고, 이런 일이 발생하면 데이터를 지원하지 않는 유형으로 데이터를 deserlize하려고 시도하기 때문에 클라이언트에 예외가 발생할 것입니다. 첫 번째 예외 (루트 이름이 'Binary'인 XML 몸체를 deserialize 할 수 없음)가 Propper 응답과 두 번째 예외 (루트 레벨의 데이터가 유효하지 않습니다. 행 1, 위치 1)를 얻을 때 throw 될 수 있습니다. 지원되지 않는 메시지가 표시됩니다.
나는 속성과 채널 팩토리가 쉽게 만들어야한다고 생각했지만 지금 XML을 내가 다시 볼 수 없으므로 지금 내 솔루션을 XMLDocumet 클래스로 간단하게 전환 할 생각입니다. 이것은 좋은 해결책이 아니지만 나는 어떤 일이 일어나고 있는지 정확히 볼 것입니다.
Edit2가
나는 내 자신의 컴퓨터에 웹 서비스에 대한 URL을 실행하면 나는 다음과 같은 답변을 얻을 것이다 :
<Error><code>E50</code><desc>IP Not Allowed</desc></Error>
아무것도 더, 나는 올바른 서버에서 실행하는 경우 (내 호스트) 재생은 고객에 따라 같은 것을해야한다 :
<Desc>
<Make cfe_code="98" cfe_value="Volkswagen" label="Märke" value="Volkswagen"/>
<ModelName cfe_code="99" cfe_value="Touareg" label="Modell" value="Touareg"/>
<BodyType cfe_code="212" cfe_value="22" label="Kaross" value="SUV"/>
...
</Desc>
E dit3 :
public XDocument GetMyData(string regNr)
{
WebClient wc = new WebClient();
wc.Credentials = new NetworkCredential("MyName", "MyPassword");
Stream s = wc.OpenRead("http://MyServer.com/ag/get?UID=9999999999.eu_vddsall_xml&VINREG=" + regNr + "&LANG=sv");
// return an XDocument for LINQ
XmlTextReader xmlReader = new XmlTextReader(s);
XDocument xdoc = XDocument.Load(xmlReader);
xmlReader.Close();
xdoc.Save(HostingEnvironment.MapPath("~/App_Data/Files/Xml/") + DateTime.Now.ToString("hhmmssfff") + ".xml");
return xdoc;
}
을 그리고이 위대한 작품 :
는 이제 호스트 서버에이 코드를 시도! 다음을 포함하는 XML 파일이 있습니다.
<?xml version="1.0" encoding="utf-8"?>
<Desc>
<Vin cfe_code="11" cfe_value="X" label="Chassie nr" value="X" />
<Make cfe_code="98" cfe_value="Volvo" label="Märke" value="Volvo" />
<ModelName cfe_code="99" cfe_value="S70" label="Modell" value="S70" />
<BodyType cfe_code="212" cfe_value="1" label="Kaross" value="Sedan" />
...
</Desc>
그럼 왜 내 WCF 버전이 작동하지 않습니까?
질문을 편집하여 [ServiceKnownType (typeObject (MyObject))]를 이미 추가했음을 알릴 수 있습니다. ICFService 인터페이스이지만 아무 것도 바뀌지 않습니다. 그렇지 않으면 사람들이 거기에서 시작할 것입니다. – Tim
@Tim> 감사합니다! 끝난. – Banshee