向DataContract添加名称和命名空间有什么作用?

Xai*_*oft 17 c# wcf

我尝试调用一个名为Register的WebInvoke方法,该方法返回一个User对象并立即返回该对象.它看起来如下:

User Register(User user)
{
    return user;
}
Run Code Online (Sandbox Code Playgroud)

我不确定在调用http:// localhost:8081/user/register时,Name和Namespace属性对DataContract属性的作用是什么?

我问的原因是因为我最初使用DataContract属性装饰了我的类,如下所示:

[DataContract]
public class User
{
   // Properties
}
Run Code Online (Sandbox Code Playgroud)

当我打开Fiddler并发送一个Post请求时,它说方法不允许,但当我将DataContract更改为:

[DataContract(Name="User", Namespace="")]
Run Code Online (Sandbox Code Playgroud)

有效.

Kir*_*rst 14

除了其他答案之外,DataContract中的命名空间允许在不同的命名空间中使用两个相同名称的对象 - 即版本控制.

允许这两个对象作为WSDL中的不同属性存在,并且只要它们具有不同的名称空间,它们就是已知的可反序列化类型:

[DataContract(Namespace = "http://myservice/v1/thing")]
V1.Thing

[DataContract(Namespace = "http://myservice/v2/thing")]
V2.Thing
Run Code Online (Sandbox Code Playgroud)

当然,它们需要存在于您的C#代码中以使其有效.或者,您也可以使用"名称"属性更改对象已知的名称.

[DataContract(Name = "Thing")]
V1.Thing

[DataContract(Name= = "newThing")]
V2.Thing
Run Code Online (Sandbox Code Playgroud)

您可以在项目中更改类名称时使用此选项,但需要支持使用"旧"名称的现有客户端.

总之,Name和Namespace属性控制在通过线路传输时对象的序列化和反序列化方式.设置它们时,您将控制客户端查看数据合同的方式.


Ced*_*icB 10

约翰的回答,IMO是正确的.

它以这种方式工作,因为当您发送SOAP消息时,元素需要进行命名空间限定,否则WCF不知道如何将SOAP反序列化为用户数据协定,因为命名空间不匹配.

在C#中,这两个对象是不同的,因为它们位于不同的命名空间中......

namespace UserServices
{
    public class User
    {
        public string FirstName { get; set; }
    }
}

namespace TempuriServices
{
    public class User
    {
        public string FirstName { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

XML/SOAP中的命名空间用于相同的目的,以确保对象来自相同的"主体"/"公司"/"组织"/"域"等.

根据我的发现,当我构建SOAP服务时,我倾向于将所有数据契约,服务契约和绑定名称空间保留在同一名称空间中,例如" http://mycompany.com/services/serviceName "

这里有一些很棒的资源...... Data Contract Equivalence => http://msdn.microsoft.com/en-us/library/ms734767.aspx Data Contract Versioning Best Practices => http://msdn.microsoft.com/en -us /库/ ms733832.aspx

希望这可以帮助.


Joh*_*ais 7

这些属性控制WSDL中元素的名称空间和名称.代码中的重要部分是Namespace="":这将覆盖默认命名空间(http://tempuri.org)并将其值设置为空URL.

最后,User类将在WSDL中从http://tempuri.org/User重命名为User.