嗨,无法反序列化具有根名称“Binary”和根名称空间的XML主体?
我(客户端)试图用ASP.NET WCF web服务进行沟通,一路上都来解决这个问题(这里的更多信息:Connect to a password protected server with WCF over HTTP)。
当运行请求方法:
var proxy = factory.CreateChannel();
var response = proxy.GetMyData(id);
我得到以下异常:
无法反序列化XML主体与根名称“二进制”和根命名空间'(操作“GetMyData”和使用XmlSerializer的合同('ICFService','http://tempuri.org/'))。确保将与XML相对应的类型添加到服务的已知类型集合中。说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。异常详细信息:System.Runtime.Serialization.SerializationException:无法使用XmlSerializer反转序列化具有根名称'Binary'和根名称空间''(用于操作'GetMyData'和合同('ICFService','http://tempuri.org/'))的XML主体。确保将与XML相对应的类型添加到服务的已知类型集合中。
难道这是一个编码问题?我如何解决它?
BestRegards
EDIT1:我添加下面一行到 “服务” 的接口:
[ServiceKnownType(typeof(MyObject))]
但这并不解决问题。
我也想补充一点,一个新的异常已经斌现在抛出:
在根级别的数据无效。行1,位置1. 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关该错误的更多信息以及源代码的位置。 异常详细信息:System.Xml.XmlException:根级别的数据无效。第1行,位置1.
这通常是我得到的第一个异常,但是当再次尝试时,我得到另一个异常?
webservice被设置为返回两种类型的XML文档,真正的消息包含一些信息并在我的应用程序中使其失效我已经使用XmlRoot和XmlElement属性创建了corsponding类(这是我添加的类如服务界面所知的那样)。可以返回的其他消息将只包含一个字符串,当发生这种情况时,可能会在我的客户端抛出异常。因为它试图将数据变为不支持它的类型。当我得到一个propper响应时,第二个异常(根级数据无效,第1行,位置1)可能是第一个异常(无法反序列化具有根名称Binary的XML主体)我收到不支持的消息。
我认为属性和的ChannelFactory应该可以很容易,但我不能看到XML我回来因此Im现在想的我的解决方案切换到简单的工作与XMLDocumet类。这不是一个好的解决方案,但我会看到发生了什么事情。
EDIT2
如果我将自己的计算机上运行针对web服务的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>
Ë 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(typeof(MyObject))]添加到ICFService接口,但这不会改变任何东西 - 否则人们会从那里开始:) – Tim
@Tim>谢谢!完成。 – Banshee