将命名空间添加到元素并在没有别名的情况下进行序列化

Posted

技术标签:

【中文标题】将命名空间添加到元素并在没有别名的情况下进行序列化【英文标题】:Add namespace to element and serialize without alias 【发布时间】:2019-08-03 02:25:08 【问题描述】:

我想为包装器设置一个命名空间。但不是用别名序列化它,我需要它在包装元素本身上。

我得到的是跟随

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:my-namepsace.com/asdf">
   <soapenv:Header/>
   <soapenv:Body>
     <urn:YVDMS_TASK>
        ...
     </urn:YVDMS_TASK>
   </soapenv:Body>
<soapenv:Envelope>

但我想要这样:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
     <YVDMS_TASK xmlns="urn:my-namepsace.com/asdf">
        ...
     </YVDMS_TASK>
   </soapenv:Body>
<soapenv:Envelope>

这可能吗?

【问题讨论】:

是的,这是可能的。我认为您正在将命名空间添加到序列化程序,而不是将 URL 添加到类。添加到序列化程序时,它会将命名空间放在根目录中,而不是放在适当的后代中。 “我需要它位于包装元素本身。”强烈建议处理此问题的任何内容都没有正确构建。从 XML 信息的角度来看,这两个示例是相同的。这意味着有人手工编写了一些 XML 处理代码,可能使用字符串修饰,而不是使用 设计 用于处理 XML 的工具。 是的。我不认为另一部分真的符合规范 【参考方案1】:

第一张图片指定了ServiceContract的命名空间,要指定你的body的命名空间,你可以试试消息契约。 但是要注意返回的类型也应该有 MessageContract 属性。

下面是我的代码。

 [MessageContract(WrapperNamespace = "www.message.com")]

public class Employee

    [MessageBodyMember(Namespace = "www.message.com")]
    public string Id  get; set; 
    [MessageBodyMember(Namespace = "www.message.com")]
    public string Name  get; set; 
    [MessageBodyMember(Namespace = "www.message.com")]
    public string Department  get; set; 
    [MessageBodyMember(Namespace = "www.message.com")]
    public string Grade  get; set; 



[ServiceContract]
public interface IEmployeeService

   [OperationContract]
    Employee GetEmployee(Employee employee);


 public class EmployeeService : IEmployeeService

    public Employee GetEmployee(Employee employee)
    
        return employee;
    

当我在客户端调用服务时

  using (ChannelFactory<IEmployeeService> ChannelFactory = new ChannelFactory<IEmployeeService>("emp"))
        
            // ChannelFactory.Endpoint.EndpointBehaviors.Add(new MyEndpointBehavior());
            IEmployeeService employeeService = ChannelFactory.CreateChannel();
            employeeService.GetEmployee(new Employee()  Name = "abc", Department = "dep", Grade = "male", Id = "1er" );
            // List<Employee> list=  employeeService.GetList();
            Console.Read();
        

结果。

更多信息请参考https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-message-contracts

【讨论】:

以上是关于将命名空间添加到元素并在没有别名的情况下进行序列化的主要内容,如果未能解决你的问题,请参考以下文章

将命名空间添加到根元素

合并DLL并更改管理命名空间

如何在 XElement 上放置命名空间别名?如何将数据源添加到现有 RDL 文档?

在不修改 C# XSD 类的情况下向 XML 序列化添加前缀和命名空间

XSLT 将命名空间前缀添加到元素最佳实践

C#中json的命名空间是哪个,还要添加啥引用?