我正在制作一个WCF REST服务,在其中我返回一些XML。
我有一个方法
的界面 [OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Xml, UriTemplate = "?listcameras", ResponseFormat = WebMessageFormat.Xml)]
List<TItem> ListItems();
TITem
[DataContract(Name = "SomeContract", Namespace = "")]
public class TITem
{
[DataMember]
public string Member1
{
get;
set;
}
[DataMember]
public string Member2
{
get;
set;
}
}
调用此方法时,我会从HTTPWebRequest返回XML格式, XML格式的TITem类型列表。注意上面我要做Namespace =“” 否则我似乎无法使用XDocument。 Descendants方法并获得匹配的名称。
如果这是从某些WCF服务取回XML的最佳方法,我只想要一些意见。 我确实希望我的WCF服务是可扩展的,并且可能在将来返回的不仅仅是XML
答案 0 :(得分:0)
使用名称为string.Empty的命名空间没有问题。使用命名空间的全部意义在于将其与具有相同DataContract名称但具有不同DataContract命名空间的其他数据协定区分开来。这一点尤为重要,因为DataContract名称/名称空间绝不一定与从CLR类型表示派生的名称/名称空间相关。
换句话说,如果您确定在应用程序的不同命名空间中不会有其他类型具有相同DataContract名称 - 和如果您认为自己不会在未来因为版本控制注意事项 - 您可以继续使用string.Empty作为数据协定命名空间。
除了操作属性(WebGet / WebInvoke)之外,您还需要考虑现在使用的绑定和行为以及将来使用的绑定和行为。例如,现在,您可能正在使用WebHttpBinding和WebHttpBehavior。您可以控制WebHttpBinding级别支持的数据格式 - XML,JSON,Binary等。您还可以控制从WebHttpBehavior返回的XML类型 - XML可以是“裸”,也可以是“包裹“,有额外的嵌套。最后,您甚至可以插入自己的DataContractSerializerOperationBehavior,以插入您自己的全新序列化程序或数据格式,如果您这样选择(但如果您这样做,则需要实现自己的序列化程序,格式化程序,行为,绑定,编码器等,就像它已经为SOAP和JSON所做的那样。)
希望这有帮助!