编辑:我问这个问题的那一刻我想尝试一下……
我已经在请求上设置了XmlNamespace属性,并且这样做了.
我已经在请求上设置了XmlNamespace属性,并且这样做了.
- request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";
但我真的不明白为什么……
在周末的大部分时间里,我一直在讨论这个问题,而我却没有让它发挥作用.
我正在尝试围绕RestFul webservice(MusicBrainz)编写一个包装器.我正在测试一个简单的例子:获取一位艺术家的详细信息并将其放入自定义的Artist对象中.
当我在RestClient上执行Execute时,它结束了,但我的对象属性为null.
但是当我使用XmlDeserializer测试反序列化时,objectproperties被填充(但不是对应于属性的属性,但我稍后会解决)
在响应的反序列化和将对象放在response.data之间会发生什么?
很可能这是我正在制作的“新手”错误,因为这是我使用RestSharp的第一步.
帮助将不胜感激..
退回的xml:
我的课 :
- public class Artist
- {
- public int Id { get; set; }
- public string Type { get; set; }
- public string Name { get; set; }
- public string SortName { get; set; }
- public string Country { get; set; }
- }
- var output = xml.Deserialize<Artist>(response);
- var response = client.Execute<T>(request);
- public T Execute<T>(RestRequest request) where T : new()
- {
- var client = new RestClient();
- client.BaseUrl = BaseUrl;
- client.Authenticator = null;
- //does not fill properties
- var response = client.Execute<T>(request);
- if (response.ErrorException != null)
- {
- throw response.ErrorException;
- }
- var xml = new XmlDeserializer();
- //fills properties
- var output = xml.Deserialize<Artist>(response);
- return response.Data;
- }
解决方法
发生这种情况是因为Execute方法在接收到响应后,会尝试根据请求的RootElement和XmlNamespace属性进行协商,并将它们复制到XmlDeserializer中.
- handler.RootElement = request.RootElement;
- handler.DateFormat = request.DateFormat;
- handler.Namespace = request.XmlNamespace;
- response.Data = handler.Deserialize<T>(raw);
如果使用不匹配的XmlNamespace传递RestRequest,则RestSharp的XmlDeserializer(在后台使用XDocument)将无法将响应XML映射到对象属性,您将获得默认值/ null值.
现在对于默认实现(当您手动创建XmlDeserializer时),如果未设置XmlNamespace,则反序列化器将执行自动检测,该检测基本上忽略响应中的所有命名空间,并仅根据其名称映射所有属性.
- // autodetect xml namespace
- if (!Namespace.HasValue())
- {
- RemoveNamespace(doc);
- }
考虑到上述所有因素,很清楚为什么在您使用以下行将XmlNamespace属性显式设置为请求对象中的匹配命名空间后,它开始工作:
- request.XmlNamespace = "http://musicbrainz.org/ns/mmd-2.0#";