WebService命名空间冲突
最近,在写webservice的项目时,遇到了几个接口中都用到同一个类名称,结果在进行项目编译时,浏览器中出现如下错误 根据提示信息,使用XML属性为该类型指定唯一的XML名称和/或命名空间。 2014/7/28补充 1、因为在WebService中,若没有给指定为DataContract属性的类指定命名空间,那么该类那序列化时,命名空间被指定为该WebService的命名空间,如WebService的命名空间是http://tempuri.org,在两天同名类都添加到该命名空间时,显然会产生冲突,故需要为同名类指定不同命名空间。需要在指出的是,DataContract类属性Namespace指定数据协定的命名空间似乎不起作用,所以用XML属性进行指定。 2、WebService与WCF的区别:在WCF中自定义类只需要给自定义类添加DataContract数据协定描述。在WCF中,自定义类若没有指定Namespace,被序列化后默认指定为该类所在namespace,若是想手动添加XML命名空间,只需添加DataContract的Namespace属性即可。 举例来说,对于下面的WebService,如果类MyClass1, MyClass2, SubClass没有指定XML命名空间,都默认都是“http://tempuri.org/”,当然在本例中,是给类SubClass添加XML属性描述,同样,如果不给SubClass添加XML描述,而给MyClass1, MyClass2指定不同命名空间可以达到相同效果。 而对于WCF来说,假设下面代码是WCF程序,即使不给任何一个类添加Namespace属性,也不会产生冲突,因为对于WebService2.MyClass1下的类MyClass1和SubClass的序列化后的targetNamespace为"http://schemas.datacontract.org/2004/07/WebService2.MyClass1",而WebService2.MyClass2下的类MyClass2和SubClass的系列化后的targetNamespace为"http://schemas.datacontract.org/2004/07/WebService2.MyClass2",因此两个SubClass不会产生冲突。 在需要进行区别的类前加 XMLRoot 和 XMLType属性 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using WebService2.MyClass1; using WebService2.MyClass2; namespace WebService2 { /// <summary> /// Service1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class Service1 : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] public MyClass2.MyClass2 MyMethod(MyClass1.MyClass1 myClass1) { return new MyClass2.MyClass2(); ; } } } using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xml.Serialization; namespace WebService2.MyClass1 { public class MyClass1 { public string class1Name; public SubClass subClass; } [XmlType(Namespace = "http://tempuri.org/MyClass1")] [XmlRoot(Namespace = "http://tempuri.org/MyClass1")] public class SubClass { public int age; } } using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xml.Serialization; namespace WebService2.MyClass2 { public class MyClass2 { public string class2Name; public SubClass subClass; } [XmlType(Namespace = "http://tempuri.org/MyClass2")] [XmlRoot(Namespace = "http://tempuri.org/MyClass2")] public class SubClass { public string name; } } 其他更多内容参看: http://bbs.csdn.net/topics/390830565?page=1 http://msdn.microsoft.com/en-us/magazine/cc164122.aspx (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |