WebService命名空间冲突

最近,在写webservice的项目时,遇到了几个接口中都用到同一个类名称,结果在进行项目编译时,浏览器中出现如下错误

WebService命名空间冲突_第1张图片

根据提示信息,使用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
{
    /// 
    /// Service1 的摘要说明
    /// 
    [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

你可能感兴趣的:(webservice)